Ceres使用经验之柯西核函数

原理

在优化中,经常会遇见有异常值的情况.如在直线拟合中,可能会出现若干个不在直线上点,此时如果每一个点的权重一样,就会导致求得的直线方程不理想.
为了增强优化过程中对异常值的鲁棒性,一种比较可行的办法是使用鲁邦和函数,常见的鲁邦和函数有:柯西核函数,huber核函数.以下以柯西核函数为例说明;
在标准的最小二乘中, r i r_i 是残差项,一般最小化如下目标函数:
m i n 1 / 2 Σ i r i 2 min 1/2\Sigma_i r_i^2
以应用柯西核函数如下:
m i n Σ c 2 2 l o g ( 1 + ( r i c ) 2 ) min \Sigma \frac{c^2}{2}log(1+(\frac{r_i}{c})^2)
与普通的最小二乘目标函数相比,采用柯西核函数之后,使得当r_i过大时,其对应的目标函数不至于过大,从而起到抑制异常值的作用.

实例

举一个简单的例子.拟合一条y=x的直线,现在出现一个(0,10)的outlier, 根据标准最小二乘,其目标函数为:
f l e a s t s q u a r e = 50 f_{leastsquare} = 50
假设c=1, 柯西核函数目标函数值:
f c a u c h y = 1 / 2 l o g ( 101 ) = 2.3 f_{cauchy} = 1/2log(101) = 2.3
可以看出使用柯西核函数之后,该点对整个系统的影响明显减小了.当然使用柯西核函数也有其缺点:

  1. 可能会导致有无数个无法观测的解."With a descending first derivative, such a function has a
    tendency to yield erroneous solutions in a way which can not be observed"
    在Ceres中,只需要在增加残差项时指定柯西核函数:
optimize_problem.AddResidualBlock(cost_function, new ceres::CauchyLoss(0.5), pose_params.data());

同时还需要制定柯西函数的c值,可以通过对目标函数求导,看出c值对目标函数值的影响:
O r = c 2 2 1 1 + ( r / c ) 2 = r 1 + ( r / c ) 2 \frac{\partial O}{\partial r} = \frac{c^2}{2} \frac{1}{1+(r/c)^2} = \frac{r}{1+(r/c)^2}
可以看出当c增大,目标函数的一阶导数越小,即异常值对目标函数影响越小.

参考

  1. Parameter Estimation Techniques: A Tutorial with Application to Conic Fitting, Zhengyou Zhang
发布了36 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wang_jun_whu/article/details/90725623