对泰勒展开求导,为什么要令其为零?
答案是,用来求函数极值,或者说求函数最优解。
比如说函数f=+
的极小值是多少?我们如何用编程的方法来求函数最优解?
这就要用泰勒展开,并求泰勒展开导数=0
假定△x=x-x0;△y=y-y0;下面是函数的泰勒展开
f(x,y)=f(x0,y0)+f'x*△x+f'y*△y+1/2*f''xx*+1/2*f''yy*
+f''xy*△x*△y
A:求泰勒展开针对X偏导数=0,上式中一,二阶导数都是一个确定的值,而非变量,所以
0=0+f'x+0+1/2*f''xx*2*△x+0+f''xy*△y=f'x+f''xx*△x+f''xy*△y
A:求泰勒展开针对Y偏导数=0,上式中一,二阶导数都是一个确定的值,而非变量,所以
0=0+0+f'y+0+1/2*f''yy*2*△y+f''xy*△x=f'y+f''yy*△y+f''xy*△x
我们想说什么呢?
我们已经可以函数求导程序化,那么泰勒展开仍然是一个函数,那么泰勒函数展开求导也可以程序化,这是第一层意思,第二,我们想说的是,我们的矩阵求导是否可以程序化呢?
我们前面只是会矩阵的一般运算,加减乘(左乘,右乘)除(求逆),关于矩阵求导仍然没有尝试过,仅仅是手工求导。
我们分两步走,第一,求出矩阵中每一项的导数,第二,导数矩阵参与一般运算。
首先,我们引入梯度的概念,即就是一阶偏导,(f'x f'y)
其次,=
,X的梯度=
,A=
我们把上面的泰勒展开换一种写法,
f(x,y)=f(x0,y0)+转置*X的梯度+(1/2)*
转置*A*
f(X)=f()+
转置*X的梯度(
)+(1/2)*
转置*A(
)*
好,这个矩阵形式的泰勒展开,我们对他求导,并置零向量==X的梯度(
)+*A(
)*
=
+
=
即0=f'x+f''xx*△x+f''xy*△y
0=f'y+f''yy*△y+f''xy*△x
所以,f()+
转置*X的梯度(
)+(1/2)*
转置*A(
)*
=f(X)矩阵求导就等于0向量,可以写成
=X的梯度(
)+*A(
)*
=
+
=
好,我们的两步走已经完成,只剩下编程序了,程序就留作业吧!
另外,sift算法中的三阶矩阵泰勒展开求导与上面相同:泰勒表达式不变,多了下列项f''xz,f''yz,f''zx,f''zy,f''zz,
所以,f()+
转置*X的梯度(
)+(1/2)*
转置*A(
)*
=f(X)矩阵求导就等于0向量,可以写成
+
=
=X的梯度(
)+*A(
)*
这样,我们就可以用程序的方式来求最优解,再也不用手工稿纸上去验算求导了。