拟牛顿法是求解线性(非线性)方程(组)的一种数值分析方法。拟牛顿法的求解方法与割线法相类似,其目的是减少由于计算导数而带来的纤首大量的计算量,构造的秩为1的昌竖贺迭代法。其迭代格式为
实现主要耐派代码
n = 1
while (norm(x - x0) >tol) &&(n <1000)
x0 = x
x = x0 - A \ funm(x0)
p = x - x0
q = funm(x) - funm(x0)
A = A + (q - A*p)*p'^rm(p)^2
n = n + 1
end
根据二阶泰勒展开,用一阶和二阶倒数确定参数迭代步长和方向
设初始向量 ,它在 处的泰勒展开如下:
,当 时
注:矩阵求导公式:
晌猛
对上式相对于 求导:
①
因此可以得到 处的迭代方程:
对应 这种形式,步长 ,方向
从上述公式可以知道,牛顿法的每一次迭代都需要计算二阶海塞矩阵,当特征和数据非常多时,时间和空间开销都会比较大。
拟牛顿法只是一种方法的统称,即用一个近似矩阵B去替代逆海塞矩阵 ,然后在每一轮迭代中更新B
怎样找到逆海塞矩阵的替代矩阵?
对上一节中的①式做一下变换:
令 , ,上式变成:
再令凳谨指 , ,得到:
①
也就是说,第k步迭代的海塞矩阵可以通过第k步的迭代步长和一阶导数差值拟合。
BFGS( Broyden–Fletcher–Goldfarb–Shanno ):
https://blog.csdn.net/itplus/article/details/21897443
用 表示 的近似, 表示 的枣配近似:
那么 的迭代公式为
设 ②,再根据①式得到的 :
交换 和 的位置:
令: ,以及
解出:
再带入到②中:
L-BFGS:
BFGS中B矩阵的每次更新都需要nXn的空间开销,L-BFGS不会直接存储B,而是①只存取需要用到的n个向量,并且②只保存了最近的m次迭代的结果,所以L-BFGS算法又做了近似。
采用第一个。首先你的两个代码的计算缺清过程和方法以及步骤是一致的。
只不过第二个将k==N放在循环内部判断是没有必要指银的。
放唯扮宴在while外面,可以节省点计算量。
如果你要求结果精度高一些的话,你调用:
x=nanewton1(fname,dfname,x0,e,N)
时e要小一些,比如说取1e-6这样。
另外:
if nargin<4
e=1e-4 %这个值也下调几个量级,作为缺省的精度。
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)