机器学习-梯度下降

定义:

梯度就是导数

梯度下降法就是一种通过求目标函数的导数来寻找目标函数最小化的方法。

梯度下降目的是找到目标函数最小化时的取值所对应的自变量的值,目的是为了找自变量X。

公式:

\theta _{i}=\theta _{i}-\alpha\dfrac{\partial J\left( \theta \right) }{\partial \theta i}

 理解:

     假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷),但

此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信

息去找到下山的路径这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他

当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的方向走,然后每

走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

按照梯度下降算法的思想,他将按如下操作达到最低点:

第一步,明确自己现在所处的位置

第二步,找到相对于该位置而言下降最快的方向

第三步, 沿着第二步找到的方向走一小步,到达一个新的位置,此时的位置肯定比原来低

第四部, 回到第一步

第五步,终止于最低点

按照以上5步,最终达到最低点,这就是梯度下降的完整流程。
具体步骤:

假设函数:  f(x)=\frac{x^{2}}{2}-2x

对x求导:f{}'(x)=x-2

初始化,也就是起点,起点可以随意的设置,这里设置为1

x_{0}=-4

学习率也可以随意的设置,这里设置为0.9

\alpha =0.9

同样,设置终止条件:

常见的终止条件有以下几种:

  1. 达到最大迭代次数:设置一个最大的迭代次数,在达到该次数后,算法停止迭代。

  2. 目标函数值小于一定阈值:设置一个小于某个阈值的目标函数值,当算法迭代到该值时,停止迭代。

  3. 梯度值小于一定阈值:设置一个小于某个阈值的梯度值,当算法达到该梯度值时,停止迭代。

  4. 参数变化量小于一定阈值:设置一个小于某个阈值的参数变化量,当算法参数变化量小于该值时,停止迭代。

  5. 其他较复杂的终止条件:如在一定时间内没有产生明显的改进等。

此处设置参数变化量小于\varepsilon =0.01

开始迭代

x_{0}=1

x_{1}=x_{0}-\alpha *f{}'(x)=-4-0.9*(-4-2)=1.4 

 dx=5.4

x_{2}=x_{1}-\alpha *f{}'(x)=1.4-0.9*(1.4-2)=1.94

dx=0.54

x_{3}=x_{2}-\alpha *f{}'(x)=1.94-0.9*(1.94-2)=1.994

dx=0.054

x_{4}=x_{3}-\alpha *f{}'(x)=1.994-0.9*(1.994-2)=1.9994

dx=0.0054<0.01

迭代结束

 逐渐向山底趋近,直到参数变化量达到所规定的\varepsilon

代码:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return 0.5 * pow (x, 2) - 2 * x

def df(x):
    return x - 2

n = 0.9  # 学习率
e = 0.01  # 误差
x0 = -4  # 初值
x = x0  # 自变量
count = 0 # 迭代次数
xs = []  # x的迭代过程记录
ys = []  # y的迭代过程记录
for num in range(10000): # 最大迭代次数为10000
    count = count +1
    dy = df(x)
    m = x
    x = x - n * dy
    dx =m - x
    if abs(dx) < e:
        break
    xs.append(x)
    ys.append(f(x))

print("迭代次数为{}" .format(count))
print("极小值点x={}, 极小值为f(x)={}" .format(x, f(x)))

xs1 = np.linspace(1, 3, 100)  # 在 -5 到 8 范围内采样 100 个点
xs2 = np.array(xs)
plt.title("image")
plt.xlabel("x")
plt.ylabel("y")
plt.xticks(np.arange(1, 3, 0.2))
plt.yticks(np.arange(-5, 2, 0.2))
plt.plot(xs1, f(xs1))
plt.scatter(xs, ys, marker='x', color='r')
plt.show()

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值