美文网首页
最速下降法的python实现

最速下降法的python实现

作者: zhouyelihua | 来源:发表于2018-12-17 10:25 被阅读0次

    代码一:

    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
    

    分析1:
    这个采用的是backtracking line search来寻找alpha。

    相关文章

      网友评论

          本文标题:最速下降法的python实现

          本文链接:https://www.haomeiwen.com/subject/kzlqkqtx.html