1、为什么要将e(x)写成e(x+dx)的形式?
2、J(x)是什么对什么的导数?
理解
1、形式上来说,e(x)和e(x+dx)并没有任何区别,以为dx本身就是小量,只要x+dx还在作用域?内,函数的意思就是一样的。
更土一点的解析,假设定义域是在[-100,100],那么只要x+dx在这个范围内,函数表示的意思就一样。
既然意思一样,为何要写成这个形式?
因为我们接下来要做的是进行迭代优化,迭代优化需要指定一个起点,即这里的e(x+dx)的x在某次迭代中,是固定的,那么e(x+dx)就变成了dx的函数了。
为何要把原本是x的函数变成是dx的函数呢?
迭代的含义是,在每一步都找到最好的变化量。像这个公式,在某次迭代中指定了x,使得e(x+dx)在x=x0附近,这段小范围的曲线(假设e(x)是一个曲线),最低点在哪里?只需要对dx求导就可以得知了。
2、J是谁对谁的?
这里的J是函数e(x)对x的求导。上面说了,迭代会指定一个x=x0,在这里开始处理,找到最优的一个dx,将dx叠加到x上,形成新的x1,再继续。
所以,这个J描述的是在x=x0处,函数e(x)的导数的具体的值,这个具体的值描述了变量随自变量的变化程度,而dx就是自变量的变化程度。
用J也是对e(x)这个函数的线性化的方法,用了这个方法后,可以将e(x+dx)展开成为dx的函数:
e(x+dx)=e(x)+J*dx,因为这里的x是指定的等于x0,J是可以计算的,所以在某次迭代中整个就成为了:e(x0)+J(x0)dx,就是dx的函数。
如果要优化的就是这个e(x0)+J(x0)dx,好像没法开展,所以会有最小二乘,即:
(e(x0)+Jdx) * (e(x0)+Jdx)
这个展开来就是关于dx的二次函数了,对dx求导并令导数为0,即可求出dx的值。
求出的这个dx的值含义是什么?
就是在该次迭代中,指定的x0附近对应的那段曲线,如果x0加上计算出来的dx,就可以得到这一小段曲线的最小值。为什么不是整体的最小值?因为J是对原函数e(x)的线性近似,只有在展开点(某次迭代点x0)处的近似才是相对准确的。当然如果e(x)本身就是线性函数,那也不用这么麻烦了,直接求导就可以知道了。
通过上面逐次迭代,不断的找出一小段曲线的对应的最低点,最终逼近整段曲线的最低点。
如果曲线是多波浪的,初值的取值就非常重要,不然就可能最终停留在非全局最低的地方,这也是为什么用imu来做预估,再用点云匹配的原因。让点云匹配在合适的地方进行。
尤其是对应阶梯,每个阶梯都是一样的,如果没有准确的估计值(估计值离真值差距起码小于半个阶梯),那么就可能错位匹配了。
3、再补充一个问题
对于
f
(
x
)
=
x
2
+
3
x
f(x)=x^2 +3x
f(x)=x2+3x
怎么找极值?
直接求导。 上面的最小二乘,就是将
e
2
(
x
)
e^2(x)
e2(x)
通过指定迭代点展开成:
e
2
(
x
+
d
x
)
e^2(x+dx)
e2(x+dx) 指定展开点x0,变成:
e
2
(
x
0
+
d
x
)
e^2(x_0+dx)
e2(x0+dx)
得到类似上二次方程的形式,得到x(即dx)。
就是说,在将原问题在某点展开线性化后,就成为了简单的求导求极值计算的问题。
当然,如果就要对
f
(
x
)
=
x
2
+
3
x
f(x)=x^2+3x
f(x)=x2+3x 利用迭代方式求解,也可以。用梯度方法,不断逼近。
即,同样假设一个初值x0,计算该处的梯度,然后指定一个步长lamda,计算下一个点:
x1=x0-f’(x0)*lamda .
直到满足要求为止。
不过显然,对于这种简单凸函数,简单处理即可。