曲线拟合优化中矩阵关系(Jacobian )


Jacobian矩阵和Hessian矩阵


1. Jacobian

在向量分析中, 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵, 其行列式称为雅可比行列式. 还有, 在代数几何中, 代数曲线的雅可比量表示雅可比簇:伴随该曲线的一个代数群, 曲线可以嵌入其中. 它们全部都以数学家卡尔·雅可比(Carl Jacob, 1804年10月4日-1851年2月18日)命名;英文雅可比量”Jacobian”可以发音为[ja ˈko bi ən]或者[ʤə ˈko bi ən].

雅可比矩阵

雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近. 因此, 雅可比矩阵类似于多元函数的导数.

假设FRnRm是一个从欧式n维空间转换到欧式m维空间的函数. 这个函数由m个实函数组成: y1(x1,…,xn), …, ym(x1,…,xn). 这些函数的偏导数(如果存在)可以组成一个m行n列的矩阵, 这就是所谓的雅可比矩阵:

[y1x1y1xnymx1ymxn]

此矩阵表示为: JF(x1,,xn), 或者(y1,,ym)(x1,,xn).

这个矩阵的第i行是由梯度函数的转置yi(i=1,…,m)表示的.

如果pRn中的一点, Fp点可微分, 那么在这一点的导数由JF(p)给出(这是求该点导数最简便的方法). 在此情况下, 由F(p)描述的线性算子即接近点pF的最优线性逼近, x逼近于p:

F(x)F(p)+JF(p)(xp)

雅可比行列式

如果m = n, 那么F是从n维空间到n维空间的函数, 且它的雅可比矩阵是一个方块矩阵. 于是我们可以取它的行列式, 称为雅可比行列式.

在某个给定点的雅可比行列式提供了 在接近该点时的表现的重要信息. 例如, 如果连续可微函数Fp点的雅可比行列式不是零, 那么它在该点附近具有反函数. 这称为反函数定理. 更进一步, 如果p点的雅可比行列式是正数, 则Fp点的取向不变;如果是负数, 则F的取向相反. 而从雅可比行列式的绝对值, 就可以知道函数Fp点的缩放因子;这就是为什么它出现在换元积分法中.

对于取向问题可以这么理解, 例如一个物体在平面上匀速运动, 如果施加一个正方向的力F, 即取向相同, 则加速运动, 类比于速度的导数加速度为正;如果施加一个反方向的力F, 即取向相反, 则减速运动, 类比于速度的导数加速度为负.

2. 海森Hessian矩阵

在数学中, 海森矩阵(Hessian matrix或Hessian)是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵, 此函数如下:

f(x1,x2,xn)

如果f的所有二阶导数都存在, 那么f的海森矩阵即:

H(f)ij(x)=DiDjf(x)

其中x=(x1,x2,xn), 即H(f)为:

[2fx212fx1x22fx1xn2fx2x12fx222fx2xn2fxnx12fxnx22fx2n]

(也有人把海森定义为以上矩阵的行列式)海森矩阵被应用于牛顿法解决的大规模优化问题.

海森矩阵在牛顿法中的应用

一般来说, 牛顿法主要应用在两个方面, 1, 求方程的根; 2, 最优化.

1), 求解方程

并不是所有的方程都有求根公式, 或者求根公式很复杂, 导致求解困难. 利用牛顿法, 可以迭代求解.

原理是利用泰勒公式, 在x0处展开, 且展开到一阶, 即f(x)=f(x0)+(xx0)f(x0)

求解方程f(x)=0, 即f(x0)+(xx0)f(x0)=0, 求解x=x1=x0f(x0)/f(x0), 因为这是利用泰勒公式的一阶展开, f(x)=f(x0)+(xx0)f(x0)处并不是完全相等, 而是近似相等, 这里求得的x1并不能让f(x)=0, 只能说f(x1)的值比f(x0)更接近f(x)=0, 于是乎, 迭代求解的想法就很自然了, 可以进而推出xn+1=xnf(xn)/f(xn), 通过迭代, 这个式子必然在f(x)=0的时候收敛. 整个过程如下图:

曲线拟合优化中矩阵关系(Jacobian )_第1张图片

2), 最优化

在最优化的问题中, 线性最优化至少可以使用单纯形法(或称不动点算法)求解, 但对于非线性优化问题, 牛顿法提供了一种求解的办法. 假设任务是优化一个目标函数f, 求函数f的极大极小问题, 可以转化为求解函数f的导数f=0的问题, 这样求可以把优化问题看成方程求解问题(f=0). 剩下的问题就和第一部分提到的牛顿法求解很相似了.

这次为了求解f=0的根, 把f(x)的泰勒展开, 展开到2阶形式:

f(x+Δx)=f(x)+f(x)Δx+12f(x)Δx2

这个式子是成立的, 当且仅当 Δx 无限趋近于0时, f(x+Δx)=f(x), 约去这两项, 并对余项式f(x)Δx+12f(x)Δx2=0Δx求导(注: f(x)f(x)均为常数项. 此时上式等价与:

f(x)+f(x)Δx=0

求解:

Δx=f(xn)f(xn)

得出迭代公式:

xn+1=xnf(xn)f(xn),n=0,1,...

一般认为牛顿法可以利用到曲线本身的信息, 比梯度下降法更容易收敛(迭代更少次数), 如下图是一个最小化一个目标方程的例子, 红色曲线是利用牛顿法迭代求解, 绿色曲线是利用梯度下降法求解.

曲线拟合优化中矩阵关系(Jacobian )_第2张图片

在上面讨论的是2维情况, 高维情况的牛顿迭代公式是:

xn+1=xn[Hf(xn)]1f(xn),n0

其中H是hessian矩阵, 定义见上. 

高维情况依然可以用牛顿迭代求解, 但是问题是Hessian矩阵引入的复杂性, 使得牛顿迭代求解的难度大大增加, 但是已经有了解决这个问题的办法就是Quasi-Newton method, 不再直接计算hessian矩阵, 而是每一步的时候使用梯度向量更新hessian矩阵的近似.

附Levenberg-Marquardt最优化迭代:

%% 本程序实现了求雅克比矩阵的解析解,Levenberg-Marquardt最优化迭代,演示了如何求解拟合问题。%%

%% 计算函数f的雅克比矩阵,是解析式
syms a b y x real;
f=a*exp(-b*x);
Jsym=jacobian(f,[a b])
data_1=[0.25 0.5 1 1.5 2 3 4 6 8];
obs_1=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];
% 2. LM算法
a0=10; b0=0.5;               % 初始猜测s
y_init = a0*exp(-b0*data_1);
Ndata=length(obs_1);   % 数据个数
Nparams=2;   % 参数维数
n_iters=50;  % 迭代最大次数
lamda=0.01;% LM算法的阻尼系数初值
updateJ=1;
a_est=a0;
b_est=b0; % step1: 变量赋值
% step2: 迭代
for it=1:n_iters
    if updateJ==1
        J=zeros(Ndata,Nparams);  % 根据当前估计值,计算雅克比矩阵
        for i=1:length(data_1)
            J(i,:)=[exp(-b_est*data_1(i)) -a_est*data_1(i)*exp(-b_est*data_1(i))];  % Jacobian矩阵是一个一阶偏导方程
        end
        y_est = a_est*exp(-b_est*data_1);         % 初始函数值
        d=obs_1-y_est;                                        % 计算误差
        H=J'*J;                    % 计算(拟)海塞矩阵
        if it==1                     % 若是第一次迭代,计算误差
            e=dot(d,d);  %计算误差的平方
        end
    end
    % 根据阻尼系数lamda混合得到H矩阵
    H_lm=H+(lamda*eye(Nparams,Nparams));  %生成单位矩阵
    % 计算步长dp,并根据步长计算新的可能的参数估计值
    dp=inv(H_lm)*(J'*d(:));
    g = J'*d(:);
    a_lm=a_est+dp(1);
    b_lm=b_est+dp(2);
    % 计算新的可能估计值对应的y和计算残差e
    y_est_lm = a_lm*exp(-b_lm*data_1);
    d_lm=obs_1-y_est_lm;
    e_lm=dot(d_lm,d_lm);
    % 根据误差决定如何更新参数和阻尼系数
    if e_lm~=0      
        lamda=lamda/10;
        a_est=a_lm;
        b_est=b_lm;
        e=e_lm;
        disp(e);
        updateJ=1;
    else
        updateJ=0;
        lamda=lamda*10;
    end
end
%% 显示优化的结果
a_est
b_est


[参考: Wikipedia]

你可能感兴趣的:(Matlab)