cvNorm cvNormalize()使用

来源:互联网 发布:java qq2007不能 编辑:程序博客网 时间:2024/05/21 22:22

一般简单的过程习惯自己实现,opencv接口比较乱而且没有特别规范的文档,不过有的函数自己实现的和调用opencv 函数效率还是有很大的差距,对数据存取模式优化要好好深入了解一下;

cvNorm()cvNormalize()基本实现所有的归一化操作,并不是只支持传统的欧式距离(L2_Norm),参数里面可以选择L1_norm 已经范围拉伸,求范数也是一样,以后要认真看函数接口参数选项,虽然opencv库组织不是太好,但是经过这么多年的完善大部分操作都会有支持的;


对于不同的norm_type, 根据我的试验(mask=null)的时候, a,b(a>b)起的作用结果如下:
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]区间.

L1_norm: 每個元素乘上1/sqrt(1+4+5+6+7+10)
L2_norm: 每個元素乘上1/sqrt(1+16+25+36+49+100)
CV_MINMAX:使每個元素限制在[a=5,b=0]之間算法如下:dst(i)=(src(i)-min(src))*(5-0)/(max(src)-min(src))


一个不错的关于各种norm的解释:

搞统计的人总是喜欢搞什么“变量选择”,变量选择实际上的限制条件是L0 Norm,但这玩艺不好整,于是就转而求L1 Norm(使用均方误差,就是Lasso,当然在Lasso出来之前搞信号处理的就有过类似的工作),Bishop在书里对着RVM好一通吹牛,其实RVM只是隐含着去近似了一个L0 Norm, 所以得到了比SVM更稀疏的解(Tipping写了RVM后不久就指出来了,可Bishop就是只字不提,好像贝叶斯推理有多牛,其实很多问题都被掩盖了起来,指望一种理论解释所有的现象总是很危险的)。最近Bin Yu给了关于Lasso一致性的几乎充要条件。  SVM方面也搞了很多L1 Norm方面的东西(就是Hinge Loss在加个L1 Norm做正则化项)。  关于L1 Norm的正则化能产生稀疏解听到过个很形象地解释,那个图(L1 Norm就是个菱形,L2 Norm是个圆)大家都看过吧,似然度(目标函数里的误差项)是个圆,求解的时候就是拿这个圆往那个菱形(L1 Norm)圆(L2 Norm)上扔,L1的话就很可能撞到角上,所以就稀疏了(上面是2维的情况,推广的多维就更容易撞到角上)。但如果这些变量高度相关呢?那似然度就不是个球了,可能是个椭球,还有可能是个非常非常扁的家伙,这次再扔就可能和正则化项很大一片都接触到了,这时候就很危险了,就果拟合了,如果数据少,那么这时就算是做交叉验证、留一也都无法避免过拟合。  有人提出来正则化项要满足“sparsity、unbiasedness、continuity”,这样Lp没有一个可以同时满足,所以有人又搞了个SCAD. 

原创粉丝点击