【机器学习 - 8】:随机梯度下降法

随机梯度下降法


为什么使用随机梯度下降法?
如果当我们数据量和样本量非常大时,每一项都要参与到梯度下降,那么它的计算量时非常大的,所以我们可以采用随机梯度下降法。
在这里插入图片描述

随机梯度下降法中的学习率必须是随着循环的次数增加而递减的。如果eta取一样的话有可能在非常接近我们的最优值时会跳过,所以随着迭代次数的增加,学习率eta要随之减小,我们可以用模拟退火的思想实现(如下图所示),t0和t1是一个常数,定值,其通常是根据经验取得一些值。
在这里插入图片描述

随机梯度下降法的实现

随机梯度下降法的公式如下图所示,其中挑出一个样本出来计算。
在这里插入图片描述

  • 先创建x,y,以下取10000个样本
import numpy as np

m = 10000

x = np.random.random(size=m)
y = x*3 + 4 + np.random.normal(size=m)
  • 写入函数
def dj_sgd(theta, x_i, y_i): # 传入一个样本,获取对应的梯度
    return x_i.T.dot(x_i.dot(theta)-y_i)*2 # MSE

def sgd(X_b, y, initial_theta, n_iters): # 求出整个theta的函数
    def learning_rate(i_iter):
        t0 = 5
        t1 = 50
        return t0/(i_iter+t1)
    theta = initial_theta
    i_iter = 1
    
    while i_iter <= n_iters:
        index = np.random.randint(0, len(X_b))
        x_i = X_b[index]
        y_i = y[index]
        gradient = dj_sgd(theta, x_i, y_i) # 求导数
        theta = theta - gradient*learning_rate(i_iter) # 求步长
        i_iter += 1
    return theta
  • 调用函数,求出截距和系数
    在这里插入图片描述

以上随机梯度的缺点是不能照顾到每一点,因此需要进行改进。

  • 以下对其中的函数进行修改。
def dj_sgd(theta, x_i, y_i): # 传入一个样本,获取对应的梯度
    return x_i.T.dot(x_i.dot(theta)-y_i)*2 # MSE

def sgd(X_b, y, initial_theta, n_iters): # 求出整个theta的函数
    def learning_rate(i_iter):
        t0 = 5
        t1 = 50
        return t0/(i_iter+t1)
    theta = initial_theta
    m = len(X_b)
    
    for cur_iter in range(n_iters): # 每一次循环都把样本打乱,n_iters的代表整个样本看几轮
        random_indexs = np.random.permutation(m)
        X_random = X_b[random_indexs]
        y_random = y[random_indexs]
        for i in range(m):
            theta = theta - learning_rate(cur_iter*m+i) * (dj_sgd(theta, X_random[i], y_random[i]))
        return theta
  • 与前边运算结果进行对比,其耗时更长。
    在这里插入图片描述
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

街 三 仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值