首页 > 编程知识 正文

最优化牛顿法算法例题,python算法详解

时间:2023-05-05 22:05:23 阅读:29787 作者:1023

伙伴们,“五一”很开心。 节前论述了长情绿草法的推导,以及拟长情绿草法中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

过去的审查:

学无止境。 请关注笔者的公众号,互相学习! 嗷大豆数据厂

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。