目录
一、前言
高斯牛顿法实际上是牛顿法的在求解非线性最小二乘问题时的一个特例。基本思想是,使用泰勒级数一阶展开式去近似地代替非线性回归模型,然后通过多次迭代,多次修正回归系数,使回归系数不断通过逼近非线性回归模型的最佳回归系数,最后使原模型的残差平方和达到最小.
泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数满足一定的条件,泰勒公式可以用函数在某一点的各阶导数值做系数构建一个多项式来近似表达这个函数.
在实际使用中,我们使用高斯牛顿法用于雷达目标聚类之后的航向估计。
二、 高斯牛顿法原理
(1) 初始值的选择。其方法有三种:
1) 根据以往的经验选定初始值;
2) 用分段法求出初始值;
3) 对于可线性化的非线性回归模型,通过线性变换,然后施行最小平方法求出初始值
总结:上述矩阵表达式中第三项有误,D_px1应当是B_px1,注意移项之后的表达式,也就是说带估计参数移动一小段Δx对应Δf(x)移动了多大距离,目标是求出一个Δx使Δf(x)移动的距离最小. 注意上述表达式中yi是理想值也是已知值,f(x,g)是根据估计参数得出的对应实际值.为了使||f(x+Δx)||^2最小求出一个增量Δx,循环迭代直到Δx变化很小,说明||f(x+Δx)||^2也变化很小,可以说已经达到最优解了.具体的可以对应以下代码理解.
三、matlab实例
计算步骤(Slam 十四讲,高斯牛顿):
y=exp(a*x^2+b*x+c)+w这个模型验证一下,其中w为噪声,a、b、c为待解算系数
clear all;
close all;
clc;
a=1;b=2;c=1; %待求解的系数
x=(0:0.01:1)';
w=rand(length(x),1)*2-1; %生成噪声
y=exp(a*x.^2+b*x+c)+w; %带噪声的模型
plot(x,y,'.')
pre=rand(3,1); %步骤1
for i=1:1000
f = exp(pre(1)*x.^2+pre(2)*x+pre(3));
g = y-f; %步骤2中的误差
p1 = exp(pre(1)*x.^2+pre(2)*x+pre(3)).*x.^2; %对a求偏导
p2 = exp(pre(1)*x.^2+pre(2)*x+pre(3)).*x; %对b求偏导
p3 = exp(pre(1)*x.^2+pre(2)*x+pre(3)); %对c求偏导
J = [p1 p2 p3]; %步骤2中的雅克比矩阵
delta = inv(J'*J)*J'* g; %步骤3,inv(J'*J)*J'为H的逆
pcur = pre+delta; %步骤4
if norm(delta) <1e-16
break;
end
pre = pcur;
end
hold on;
plot(x,exp(a*x.^2+b*x+c),'r');
plot(x,exp(pre(1)*x.^2+pre(2)*x+pre(3)),'g');
%比较一下
[a b c]
pre'
参考:
多元高斯牛顿法推导:https://www.zhihu.com/question/419979308
最小二乘法,梯度下降法,牛顿迭代法,高斯牛顿法原理整理:https://blog.csdn.net/Q987654351/article/details/106188194