Ceres使用经验之柯西核函数

原理

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

实例

举一个简单的例子.拟合一条y=x的直线,现在出现一个(0,10)的outlier, 根据标准最小二乘,其目标函数为:
f l e a s t s q u a r e = 50 f_{leastsquare} = 50 fleastsquare=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 fcauchy=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} rO=2c21+(r/c)21=1+(r/c)2r
可以看出当c增大,目标函数的一阶导数越小,即异常值对目标函数影响越小.

参考

  1. Parameter Estimation Techniques: A Tutorial with Application to Conic Fitting, Zhengyou Zhang
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手持电烙铁的侠客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值