优化算法笔记02:差分近似导数

在优化问题中,有时会用有限差分法近似求目标函数的Hessian矩阵,下面介绍这一方法。

 

如果函数的自变量是一个向量,那么根据函数值的类型,有:

标量的导数是向量,标量的偏导数是标量;

向量的导数是矩阵,向量的偏导数是向量。

 

比如,函数 g:R^3 \mapsto R^3

套一个具体的函数:g(x)=x+3, x=\left ( x_1,x_2,x_3 \right )^T,这个函数求导很简单,导数是一个三阶单位矩阵,本文只是拿它来举例说明。

此函数可以写成 g(x)=\begin{pmatrix} g_1(x)\\ g_2(x)\\ g_3(x) \end{pmatrix}=\begin{pmatrix} x_1+3\\ x_2+3\\ x_3+3 \end{pmatrix}

根据偏导数的定义,有\frac{\partial g(x)}{\partial x_1}=\lim _{\alpha\to0}\frac{g(x+\alpha e_1)-g(x)}{\alpha}=\lim_{\alpha\to0}\frac{g(x+\alpha\cdot \begin{pmatrix} 1\\ 0\\ 0 \end{pmatrix})-g(x)}{\alpha}

如果将\alpha取成一个很小的数,把极限符号拿掉,就实现了用差分近似微分:

\frac{\partial g(x)}{\partial x_1}\approx \left [ \begin{pmatrix} x_1+\alpha+3\\ x_2+3\\ x_3+3 \end{pmatrix}-\begin{pmatrix} x_1+3\\ x_2+3\\ x_3+3 \end{pmatrix}\right ]\cdot \frac{1}{\alpha}=\begin{pmatrix} 1\\ 0\\ 0 \end{pmatrix}

同理求另外两个分量的偏导数,就可以得出导数是一个三阶单位阵。

 

有了这个思想,就可以用MATLAB实现有限差分近似求导。

% 定义函数
g=@(x)x+3;
% 定义自变量向量
x=[2;3;4];
% 获取维度
n=size(x,1);
% 创建导数矩阵
H=zeros(n);
% 取阿尔法为一个很小的数
alpha=1e-6;
% 逐列求导数向量
for k=1:n
    ei=zeros(n,1);
    ei(k)=1;
    H(:,k)=(g(x+alpha*ei)-g(x))/alpha;
end
disp(H);

输出:

>> test
    1.0000         0         0
         0    1.0000         0
         0         0    1.0000

近似的结果是正确的。

 

 

你可能感兴趣的:(优化算法)