使用梯度下降与共轭梯度法求解:
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、共轭梯度法是介于
最速下降法
与
牛顿法
之间的一个方法,它仅需利用
一阶导数
信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算海塞矩阵并求逆的缺点,共轭梯度法不仅是解决大型
线性方程组
最有用的方法之一,也是解大型非线性最优化最有效的算法之一。其优点是所需
存储量
小,具有步收敛性,稳定性高,而且不需要任何外来参数。