伙伴们,“五一”很开心。 节前论述了长情绿草法的推导,以及拟长情绿草法中DFP算法的推导和Python手写的实现。 今天我们继续谈谈长情绿草法中BFGS算法的推导与实现。
1、BFGS算法(broyden-Fletcher-goldf ARB-shanno )导出为DFP算法,我们使用矩阵
逼近黑塞矩阵的逆矩阵
相应的拟长情绿草条件是DFP算法的拟长情绿草条件在BFGS算法中使用矩阵
逼近黑塞矩阵
假设对应的伪长情的绿草条件与BFGS算法的伪长情的绿草条件一样,都是两侧相乘的
为了满足上式的要求,求解矩阵p的过程可以是: 求解矩阵q的过程如下。 最终,BFGS算法中的迭代公式如下。 至此可以用矩阵b逼近海赛矩阵h,但这不是我们的最终目的,毕竟我们想得到矩阵b逆矩阵的迭代公式,所以省略了用Sherman-Morrison公式导出的Sherman-Morrison公式的导出过程,最后得到的矩阵b的逆矩阵迭代公式如下
Python实现BFGS算法:
在最后一个DFP算法之后添加方法。
deftrain(self,x,y,n_iters=1000,learning_rate=0.01 ) :
' ' fit model ' ' '
if X.ndim 2:
raisevalueerror (xmustbe 2d阵列- like! ' )
self.trainSet=X
self.label=y
if self.method.lower (==' gradient ' :
self._ logisticregressionself _ _ train _ gradient (n _ iters,learning_rate ) )。
elif self.method.lower (==' Newton ' :
self._ logisticregressionself _ _ train _ Newton (n _ iters ) ) ) )。
elif self.method.lower (==' DFP ' :
self.__train_DFP(n_iters,learning_rate ) )。
elif self.method.lower (==' bfgs ' :
self.__train_bfgs(n_iters,learning_rate ) )。
else:
raisevalueerror (' methodvaluenotfound!' )
返回
在写算法本体之前,我们也先看看BFGS的简易优化过程。 参数W0初始化、代替矩阵Bk0的初始化、初始梯度Gk0的计算、反复次数k;
while(kn_iters ) and(||GK0||e ) :
1 .计算需要优化w0的方向Pk=Bk*Gk0
2 .更新参数W1如下:
---- for n in N:
--------用一维搜索方法尝试改变Pk的学习率,
--------求出最小似然,
求出--------和Deltaw(W1-W0 )
3 .更新坡度Gk1,求出Deltag(GK1-GK0 )
4 .更新bk1,利用上述导出的BFGS的反复式
5 .重新代入w0、Bk0、Gk0
6.k=1结束。
由此可知,只要直接复用DFP算法的内环,也变更外环即可
的迭代方法。
#一种新的绿草法-BFGS优化算法
def_train_bfgs(self,n_iters,learning_rate ) :
n_samples,n_features=self.trainSet.shape
X=self.trainSet
y=self.label
将#w和b合并,在x的末尾添加一列所有1的特征
x2=NP.h堆栈() x,NP.ones (n _ samples,1 ) )
将#y置换为(n_samples,1 )的矩阵
y=NP.Expand_dims(y,axis=1) ) ) ) ) ) ) )。
#初始化特征系数w,初始化代替对称矩阵
w=NP.Zeros((1,n_features 1) ) )
BK0=NP.eye(n_features1) )。
#计算初始预测值、似然值,记录似然值
Ypreprob,ll0=self.pvandllv(x2,y,w ) )。
self.lllist.append(ll0 ) )。
#根据初始预测值计算初始坡度,记录坡度的幅度
gk0=self._ logisticregressionself _ cal gradient (x2,y,Ypreprob ) ) ) ) ) ) ) ) ) )。
Gralength=NP.LinaLG.norm(GK0 ) ) ) ) ) ) ) ) )。
自. gralist.append (gralength )
#初始化反复次数
k=0
wile(kself.tol ) :
#计算优化方向的值Pk=Gk0.Bk0
PK=NP.dot(GK0,Bk0 ) ) )。
#用一维搜索更新参数,保存求出的最小似然值
w,deltaW,min_LLvalue,ypreprob=self.__updatew(x2,y,learning_rate,w,Pk ) ) ) ) ) ) )。
self.lllist.append(min_llvalue ) )。
#更新梯度Gk和增量,同时求出梯度的模式长度和更新前后的模式长度之差
gk1=self._ logisticregressionself _ cal gradient (x2,y,Ypreprob ) ) ) ) ) ) ) ) ) )。
Gralength=NP.LinaLG.norm(GK1 ) ) ) ) ) ) ) ) )。
自. gralist.append (gralength )
deltaG=Gk1 - Gk0
Gk0=Gk1
#更新替代矩阵Bk
TEMP=(NP.eye(n_features1)-NP.dot ) deltaG.T,deltaG )/NP.dot (deltag,deltaG.T ) )
BK1=NP.dot(NP.dot ) temp.T,Bk0 ) temp.T ) NP.dot (deltaW,deltaw )/NP.dot (deltaw,deltaG.T ) )
Bk0=Bk1
k =1
self.n_iters=k
self.w=w.Flatten([:-1]
self.b=W.flatten () [-1]
ypre=NP.arg max (NP.column _ stack ((1- ypreprob,ypreprob ) )、axis=1) ) ) )。
self.accuRancy=sum(ypre==y )/n_samples
第print ()次迭代停止、梯度模式长度()、似然值()、准确率() )、self.n_iters、self.gralist(-1 )、self.llist) )。
打印(w : ); nb:{}.format(self.w,self.b ) )
与returnDFP算法进行比较。 我们先来看看DFP算法的结果。 接下来,我们来看看BFGS算法的结果。 其实多次实验结果表明,DFP和BFGS算法的似然值和梯度下降曲线比较近似,但在相同的停止条件下BFGS的迭代次数更少。
以上是拟长情的绿草法BFGS算法的所有内容,谢谢你阅读。
所有代码均可下载到https://github.com/shoucang Jia1qu/ml _ HSD yt/tree/master/logisticregressiongithub.com
过去的审查:
学无止境。 请关注笔者的公众号,互相学习! 嗷大豆数据厂