0


hnu计算机与人工智能概论5.26(梯度下降法)

第1关:用梯度下降法求一元函数的最小值

本关任务:用梯度下降法求函数的最小值,认为当函数导数的绝对值小于1e-6时为函数的最小值处。函数为:

y=−sin(1/10∗x)−x1/3

,请保留6位小数输出函数最小值以及此时的x值以及迭代次数。 如果超出给定的最大迭代次数10000次,函数导数的绝对值依然大于等于1e-6,则输出False。 注意:x的初值以及学习率从键盘录入

import math
x=eval(input('请输入x的初值:'))
lr=eval(input('请输入学习率:'))#学习率,
precision=1e-6#设置收敛精度,f'(x)与0值的差异
max_iters=10000#最大迭代次数
###################begin############
def f(x):  return -math.sin(x/10)-math.pow(x,1/3)   
def df(x):  return -(1/10)*math.cos(x/10)-(1/3)*math.pow(x,(-2/3))
for i in range(max_iters):
    x=x-df(x) * lr
    if abs(df(x)) <precision:      
        print("x=%.6f"%x) 
        print('最小值=%.6f'%f(x))
        print('迭代次数=',i+1,sep='')
        break 
else:
    print('False')
##################end#######################

第2关:用梯度下降法求二元函数的最值

本关任务:用梯度下降法求二元函数f(x,y)=x3−y3+3x2+3y2−9x的最小值。要求最小值处的函数偏导数值小于1e-6,设置最大迭代次数10000,如果迭代结束都没有达到精度要求,则输出False,否则以保留8位小数的方式输出最小值以及此时的x值和y值,以及迭代次数。

import numpy as np
seed1,seed2=eval(input('请输入随机数种子:'))
lr=eval(input('请输入学习率:'))  #lr是学习率
np.random.seed(seed1)
x=np.random.randn()#二元函数f(x,y)中,自变量x的初值
np.random.seed(seed2)
y=np.random.randn()#二元函数f(x,y)中,自变量y的初值
err=1e-6 ##误差,要求最小值处的函数的两个偏导数的绝对值都小于误差err
max_iters=10000   #最大迭代次数
#请用梯度下降法求出给定二元函数f(x,y)的最值及相关信息
##################begin################
import numpy as np
def f(x,y):
    return x**3-y**3+3*(x**2)+3*(y**2)-9*x
def dx(x,y):
    return 3*x**2+6*x-9
def dy(x,y):
    return -3*y**2+6*y
for t in range(max_iters):
    if abs(dx(x,y))<err and abs(dy(x,y))<err:
        print("迭代次数%d,x=%.8f,y=%.8f,f(x,y)=%.8f"%(t,x,y,f(x,y)))
        break
    x=x-lr*dx(x,y); y=y-lr*dy(x,y) 
else:    print(False)
标签: 人工智能 python

本文转载自: https://blog.csdn.net/howell55/article/details/130932802
版权归原作者 howell(Python) 所有, 如有侵权,请联系我们删除。

“hnu计算机与人工智能概论5.26(梯度下降法)”的评论:

还没有评论