使用代码模拟梯度下降

import numpy as np
import matplotlib.pyplot as plt

f = lambda x: (x - 3.5) ** 2 - 4.5 * x + 10
x = np.linspace(0, 10, 200)
y = f(x)
plt.plot(x, y, color='g')

方式一: 求导

g = lambda x: 2 * (x - 3.5) - 4.5
# 令导数等于0  g=0
# 0 = 2 * (x-3.5)-4.5
# 2x - 11.5 = 0
x_min = 11.5 / 2
print(x_min)

方式二:梯度下降

if np.abs(x_ - last_x_) < precision: 通过对x_和last_x_进行对比查看学习率的变化判断是不是已经达到了最优

step = 0.01  #学习率
# 瞎蒙  随机的最小值
x_ = np.random.randint(0, 12, size=1)[0]
print("随机生产学习", '+++++++++++++++++++++++++++++++', x_)
# 记录上一次梯度下降的x_值
last_x_ = x_ + 2  # 只要与x_有一个比较大差值,就可以
# 需要使用x_和last_x_ 差值,作为退出条件
# 精确度  退出条件
precision = 1e-4
x_result = [x_]
count = 0
while True:
    if np.abs(x_ - last_x_) < precision:
        break
    else:
        # 更新之前的last_x_
        last_x_ = x_  # 将当前的x_复制给last_x_
        # 更新当前的x_
        x_ = x_ - step * g(x_)  #梯度下降更新权重,目标值
        x_result.append(x_)
        print('__________________________________', x_)
plt.figure(figsize=(9, 6))
plt.plot(x, y, color='red')
plt.scatter(np.array(x_result), f(np.array(x_result)), color='green')

在这里插入图片描述
if np.abs(g(x_)) < precision: 通过公式判断导数是不是趋于0 进行判断是不是达到最优

step = 0.01  #学习率
# 瞎蒙  随机的最小值
x_ = np.random.randint(0, 12, size=1)[0]
print("随机生产学习", '+++++++++++++++++++++++++++++++', x_)
# 记录上一次梯度下降的x_值
last_x_ = x_ + 2  # 只要与x_有一个比较大差值,就可以
# 需要使用x_和last_x_ 差值,作为退出条件
# 精确度  退出条件
precision = 1e-4
x_result = [x_]
count = 0
while True:
    if np.abs(g(x_)) < precision:  # 判断的梯度趋于0,到达最小值,山谷处,她的导数为0
        break
    else:
        # 更新之前的last_x_
        last_x_ = x_  # 将当前的x_复制给last_x_
        # 更新当前的x_
        x_ = x_ - step * g(x_)  #梯度下降更新权重,目标值
        x_result.append(x_)
        print('__________________________________', x_)
plt.figure(figsize=(9, 6))
plt.plot(x, y, color='red')
plt.scatter(np.array(x_result), f(np.array(x_result)), color='green')

if np.abs((f(x_)) - f(last_x_)) / np.abs(f(last_x_)) < precision: # 利用损失函数进行判断是不是已经达到了最优

step = 0.01  #学习率
# 瞎蒙  随机的最小值
x_ = np.random.randint(0, 12, size=1)[0]
print("随机生产学习", '+++++++++++++++++++++++++++++++', x_)
# 记录上一次梯度下降的x_值
last_x_ = x_ + 2  # 只要与x_有一个比较大差值,就可以
# 需要使用x_和last_x_ 差值,作为退出条件
# 精确度  退出条件
precision = 1e-4
x_result = [x_]
count = 0
while True:
 if np.abs((f(x_)) - f(last_x_)) / np.abs(f(last_x_)) < precision:  # 利用损失函数进行判断
        break
    else:
        # 更新之前的last_x_
        last_x_ = x_  # 将当前的x_复制给last_x_
        # 更新当前的x_
        x_ = x_ - step * g(x_)  #梯度下降更新权重,目标值
        x_result.append(x_)
        print('__________________________________', x_)
plt.figure(figsize=(9, 6))
plt.plot(x, y, color='red')
plt.scatter(np.array(x_result), f(np.array(x_result)), color='green')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿龙的代码在报错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值