Python实现最速下降法:基于SymPy与Backtracking Line Search
本文通过Python代码演示最速下降法的完整实现。利用SymPy进行符号微分计算梯度,结合Backtracking Line Search策略动态调整步长alpha。以Himmelblau函数为例,展示从初始化到收敛的迭代过程,适用于数值优化入门学习。
Python最速下降法实现概述
本文分享一段使用Python实现最速下降法的具体代码示例,供读者参考学习。
具体实现代码如下:
核心代码与Backtracking Line Search机制
from sympy import *
import numpy as np
def backtracking_line_search(f,df,x,x_k,p_k,alpha0):
rho=0.5
c=10**-4
alpha=alpha0
replacements1=zip(x,x_k)
replacements2=zip(x,x_k+alpha*p_k)
f_k=f.subs(replacements1)
df_p=np.dot([df_.subs(replacements1) for df_ in df],p_k)
while f.subs(replacements2)>f_k+c*alpha*df_p:
alpha=rho*alpha
replacements2 = zip(x, x_k +alpha * p_k)
return alpha
def stepest_line_search(f,x,x0,alpha0):
df = [diff(f, x_) for x_ in x]
x_k=x0
alpha=alpha0
replacements=zip(x,x_k)
len_df = sqrt(np.sum([df_.subs(replacements) ** 2 for df_ in df]))
while len_df>1e-6:
p_k=-1*np.array([df_.subs(replacements) for df_ in df])
alpha = backtracking_line_search(f, df, x, x_k, p_k, alpha)
x_k=x_k+alpha*p_k
replacements = zip(x, x_k)
len_df=np.sum([df_.subs(replacements)**2 for df_ in df])
return x_k
if __name__=="__main__":
init_printing(use_unicode=True)
x1 = symbols("x1")
x2 = symbols("x2")
x = np.array([x1, x2])
f = 100 * (x2 - x1 ** 2)**2 + (1 - x1) ** 2
ans=stepest_line_search(f, x, np.array([1.2, 1]), 1)
print "the minimal value in point:",ans
算法逻辑与步长确定策略
代码逻辑分析如下:
该算法核心采用Backtracking Line Search(回溯线搜索)机制来动态确定最优步长alpha。

以上内容为本文的全部分享,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













