2019-10-06 梯度下降法Python实践——求函数的最小值

代码还是有很多地方需要完善的,需要近一步的学习

import math

#使用梯度下降法求函数的最小值
# f = exp(X^2+(y-2)^2)   初始点为(1,1)



#设计函数

def function_one(x_input,y_input):   # 函数的输入 x,y
    f = math.exp(x_input**2 + (y_input-2)**2)  # 算出f 的值
    dx = 2*x_input*f                           # 算出 一阶x导数的值
    dy = 2*(y_input-2)*f                       # 算出 一阶y导数的值
    
    return f, dx, dy                           # 返回三个值

def main():
    x = 1 #初始点
    y = 1 #初始点
    
    a = 0.05  # 设置步长
    
    error = 0.000001  # 设置误差函数
    
    f_old, dx, dy = function_one(x,y) # 算出初始的值
    
    for i in range(100):    # 开始循环 梯度下降 设置循环的次数
        x -= a*dx
        y -= a*dy
        f_result, dx, dy = function_one(x,y)  # 获得第一次计算的初始值
        
        if abs(f_result - f_old) < error:       # 下降的结果绝对值与误差进行比较 如果再允许范围内则终止
            f_final = f_result
            print("最小值为: %.5f, 循环次数: %d, 误差:%8f" % (f_final, i , abs(f_result - f_old)))
            break
        print("第 %d 次循环, 函数值为 %f" % (i, f_result))
        f_old = f_result
        
        
if __name__ == '__main__':
    main()

结果如下:

结果

你可能感兴趣的:(2019-10-06 梯度下降法Python实践——求函数的最小值)