原理
在优化中,经常会遇见有异常值的情况.如在直线拟合中,可能会出现若干个不在直线上点,此时如果每一个点的权重一样,就会导致求得的直线方程不理想.
为了增强优化过程中对异常值的鲁棒性,一种比较可行的办法是使用鲁邦和函数,常见的鲁邦和函数有:柯西核函数,huber核函数.以下以柯西核函数为例说明;
在标准的最小二乘中,
是残差项,一般最小化如下目标函数:
以应用柯西核函数如下:
与普通的最小二乘目标函数相比,采用柯西核函数之后,使得当r_i过大时,其对应的目标函数不至于过大,从而起到抑制异常值的作用.
实例
举一个简单的例子.拟合一条y=x的直线,现在出现一个(0,10)的outlier, 根据标准最小二乘,其目标函数为:
假设c=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值对目标函数值的影响:
可以看出当c增大,目标函数的一阶导数越小,即异常值对目标函数影响越小.
参考
- Parameter Estimation Techniques: A Tutorial with Application to Conic Fitting, Zhengyou Zhang