搞统计的人总是喜欢搞什么“变量选择”,变量选择实际上的限制条件是L0 Norm,但难于求解,于是就转而求L1 Norm(使用均方误差,就是Lasso)。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void cvNormalize( const CvArr* src, CvArr* dst,double a=1, double b=0, int norm_type=CV_L2,const CvArr* mask=NULL ); src 输入数组 dst 输出数组,支持原地运算 a 输出数组的最小/最大值或者输出数组的范数 b 输出数组的最大/最小值 norm_type 归一化的类型,可以有以下的取值: CV_C - 归一化数组的C-范数(绝对值的最大值) CV_L1 - 归一化数组的L1-范数(绝对值的和) CV_L2 - 归一化数组的(欧几里德)L2-范数 CV_MINMAX - 数组的数值被平移或缩放到一个指定的范围 mask 操作掩膜,用于指示函数是否仅仅对指定的元素进行操作 该函数归一化输入数组使它的范数或者数值范围在一定的范围内 |
norm_type=CV_C时, src 被重新"缩放"(rescale)到dst, 使得dst的值是线性映射到[0,1]区间.(a,b其实无作用)
norm_type=CV_L1,或者 CV_L2时, 得到L1,L2规范化的dst.(a,b其实无作用)
norm_type=CV_MINMAX时, src会被缩放(rescale)和移动(translation)到dst,使得dst的值是线性映射到[b,a]区间. dst(i)=(src(i)-min(src))*(5-0)/(max(src)-min(src))
映射关系可以通过如下求解:
设;;,则
得出;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
void displayMat(const CvMat* mat){ int col=mat->width; int row=mat->height; double* data=mat->data.db; for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ cout<<data[i*col+j]<<", "; } } cout<<endl; } int main (int argc, char * const argv[]){ double data[]={1,4,5,6,7,10}; //CvMat* src=cvCreateMat(6, 1, CV_32FC1); CvMat src=cvMat(6,1,CV_64FC1,data); CvMat dst=cvMat(6,1,CV_64FC1,data); cout<<"a=5,b=0: "; cvNormalize(&src,&dst,5,0,CV_C,NULL); displayMat(&dst); cout<<"---------"<<endl; std::cout<<"a=5,b=0: "; cvNormalize(&src,&dst,5,0,CV_L1,NULL); displayMat(&dst); cout<<"---------"<<endl; std::cout<<"a=5,b=0: "; cvNormalize(&src,&dst,5,0,CV_L2,NULL); displayMat(&dst); cout<<"---------"<<endl; std::cout<<"a=5,b=0: "; cvNormalize(&src,&dst,5,0,CV_MINMAX,NULL); displayMat(&dst); cout<<"---------"<<endl; return 0; } |