梯度下降与共轭梯度法求解最优化应用

  • Post author:
  • Post category:其他


使用梯度下降与共轭梯度法求解:

python源码:

from numpy import *

import matplotlib.pyplot as plt

def opt330(X: ndarray, r: int, alpha: float, beta: float, alg: str, maxiter: int = 2000):

global A

global B

global step

res = []  #迭代散点

fx_fro_a = gradient_f_a(A,B)

fx_fro_b = gradient_f_b(A,B)

d_a = A

d_b = B

for j in range(maxiter):

if(alg==’gradient’):

A = A – step*gradient_f_a(A,B)

B = B – step*gradient_f_b(A,B)

elif(alg==’cg’):

d_a = – gradient_f_a(A,B) + d_a*(gradient_f_a(A,B).ravel().T.dot((gradient_f_a(A,B)-fx_fro_a).ravel()))/(fx_fro_a.ravel().T.dot(fx_fro_a.ravel()))

d_b = – gradient_f_b(A,B) + d_b*(gradient_f_b(A,B).ravel().T.dot((gradient_f_b(A,B)-fx_fro_b).ravel()))/(fx_fro_b.ravel().T.dot(fx_fro_b.ravel()))

fx_fro_a = gradient_f_a(A,B)

fx_fro_b = gradient_f_b(A, B)

A = A + step*d_a

B = B + step*d_b

res.append(f(A,B))

title = ‘alpha=’+str(alpha)+’  beta=’+str(beta)

plt.plot(res,color=”red”)

plt.title(title)

plt.rcParams[‘font.sans-serif’]=[‘SimHei’]

plt.rcParams[‘axes.unicode_minus’]=False

plt.xlabel(“迭代次数”)

plt.ylabel(“函数最小值”)

plt.show()

#print()

print(‘%d'”次迭代后的最小值为:”%maxiter)

print(res[-1])

return A, B.T

def  gradient_f_a(a,b):

return -2*dot(X,b)+2*a.dot(dot(b.T,b))+alpha*a

def  gradient_f_b(a,b):

return -2*dot(X.T,a)+2*b.dot(dot(a.T,a))+beta*b

def f(a,b):

return pow(linalg.norm(X-dot(a,b.T)),2)+alpha*pow(linalg.norm(a),2)+beta*pow(linalg.norm(b),2)

if __name__ == ‘__main__’:

alg = “cg”       #gradient:梯度下降  cg:共轭梯度

alpha = 1

beta = 2

maxiter = 2000   #迭代次数

R = 5

A = random.random((50,R))

B = random.random((20,R))

step = 0.0008     #步长

print(“默认:” + “\n” + “R = 5″ + ”   ” + “α = 1″ + ”   ” + “β = 2″ + ”   ” + ” maxiter =2000″ +”\n” “默认共轭梯度”)

define = str(input(“自定义参数(Y/N):”))

if(define == ‘Y’):

R = int(input(“设置R(default R = 5):”))

alpha = int(input(“设置α(default α = 1):”))

beta = int(input(“设置β(default β = 2):”))

iterations = int(input(“设置maxiter(default 2000):”))

alg = str(input(“设置alg(gradient or cg):”))

A = random.random((50,R))

B = random.random((20,R))

X = A.dot(B.T)

opt330(X,R,alpha,beta,alg,maxiter)

源码百度云:链接:https://pan.baidu.com/s/1BAgof7ilY0RtVEOOCKdleA    提取码:jjfz

复制这段内容后打开百度网盘手机App,操作更方便哦


共轭梯度法运行结果:



梯度下降法运行结果:

梯度下降算法迭代公式:

共轭梯度迭代公式:

算法特点:

1、梯度下降算法并不能保证被优化函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解,因此不能保证一定达到全局最优,受限于损失函数是否为凸函数。

2、梯度下降算法由于要在全部数据上最小化损失,在海量训练数据下,计算时间长。

3、共轭梯度法是介于

最速下降法



牛顿法

之间的一个方法,它仅需利用

一阶导数

信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算海塞矩阵并求逆的缺点,共轭梯度法不仅是解决大型

线性方程组

最有用的方法之一,也是解大型非线性最优化最有效的算法之一。其优点是所需

存储量

小,具有步收敛性,稳定性高,而且不需要任何外来参数。



版权声明:本文为qq_32809093原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。