Advertisement

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

阅读量:

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

python源码:

from numpy import *
import matplotlib.pyplot as plt

def opt330函数(X为ndarray类型,r为整数,alpha为浮点数,beta为浮点数,alg为字符串类型,maxiter设为整数类型且默认值设为2000):
A设为全局变量
B设为全局变量
res列表初始化为空
计算A,B的梯度f_a得到fx_fro_a
计算A,B的梯度f_b得到fx_fro_b
d_a设为A
d_b设为B

for _ 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 = -(grad_f_a)(A, B) + d_a * [(grad_f_a)(A, B).ravel().T.dot((grad_f_a)(A, B)-fx_fro_a).ravel()] / (fx_fro_a.ravel().T.dot(fx_fro_a.ravel()))
d_b = -(grad_f_b)(A, B) + d _b * [(grad _f _b)(A, B)\ .ravel() \ .T.dot( (grad _f _b)(A, B)-fx _f ro _b )\ .ravel()] / (fx _ fro _b. ravel() \ .T.dot( fx\ _ fro\ _ b. ravel()))
fx\ _ fro\ _ a= (grad\ _ f\ _ a)(A, B)
fx\ _ fro\ _ b= (grad\ _ f\ _ b)(A, B)
A += step * d \( a
B += step * d \( b
res.append(f(A, B))

title = 'alpha='+str(alpha)+' beta='+str(beta)
plt.plot(res,color="red")
plt.title(title)

设置字体为SimHei字体族。
plt.rcParams['axes.unicode_minus']被设置为False。

plt.xlabel("迭代次数")
plt.ylabel("函数最小值")
plt.show()

#print()
print('%d'"次迭代后的最小值为:"%maxiter)
print(res[-1])

return A, B.T

梯度计算函数 grad_f_a 接受两个参数 a 和 b:首先计算 X 点乘 b 的结果并取其负值;然后将 a 与 b 转置后点乘自身再相乘两次并加到前一结果上;最后加上 alpha 乘以 a 的值即为最终结果。
梯度计算函数 grad_f_b 接受两个参数 a 和 b:首先计算 X 转置点乘 a 的结果并取其负值;然后将 b 与 a 转置后点乘自身再相乘两次并加到前一结果上;最后加上 beta 乘以 b 的值即为最终结果。

def cost_function(weights, biases):
return (
linalg.norm(X - matrix multiplication of weights and biases.T)**2 +
alpha * linalg.norm(weights)**2 +
beta * linalg.norm(biases)**2
)

if name == 'main':

alg = "cg" #corresponding to: 共轭梯度法 gradient:梯度下降 cg:共轭梯度
alpha = 1
beta = 2
maxiter = 2000 #number of iterations
R = 5
A = random.random((50,R))
B = random.random((20,R))
step = 0.0008 #step size

print("默认:\nR = 5\nα = 1\nβ = 2\nmaxiter = 2000\n默认共轭梯度")
define = str(input("是否自定义参数(Y/N):"))
if define == 'Y':
R_val = int(input("请设置R(默认为5):"))
alpha_val = int(input("请设定α值(默认为1):"))
beta_val = int(input("请设定β值(默认为2):"))
iterations_val = int(input("请设置迭代次数(默认为2000):"))
alg_type = str(input("请指定算法类型(梯度法或共轭梯度法):"))
A_matrix = random.random((50, R_val))
B_matrix = random.random((20, R_val))

X = A.dot(B.T)
opt330(X,R,alpha,beta,alg,maxiter)

代码资源百度云:下载链接为https://pan.baidu.com/s/1BAgof7ilY0RtVEOOCKdleA;密码为jjfz。点击复制此链接至手机端的百度网盘App中使用, 使用起来更加便捷。

共轭梯度法运行结果:

梯度下降法运行结果:

梯度下降算法迭代公式:

共轭梯度迭代公式:

算法特点:

梯度下降方法不一定能达到整体最佳值;仅当目标具有凹性特征时可确保找到最小值;因此无法绝对确保会到达整体最佳点;其收敛效果受目标类型影响。

梯度下降算法旨在最小化整体损失,在面对海量的数据集时其计算效率较低

共轭梯形法处于最快下降法牛顿法之间的中间位置上的一种方法,在仅依靠一阶导数信息的基础上实现了良好的性能特征:一方面它成功克服了最快下降法收敛较为缓慢的问题;另一方面它也避开了牛顿法所需的内存密集型计算——存储并求解海塞矩阵的过程;整体而言该算法既展现出极佳的计算效率(因为它只需要有限内存),又具备快速收敛性(每经过几步迭代就能显著逼近最优解),并且具有较高的数值稳定性(在实际应用中不容易陷入振荡状态),同时也不需要引入任何额外参数就能完成运算任务

全部评论 (0)

还没有任何评论哟~