利用梯度下降法(gradient descent)解决线性回归实战

引言

对于机器学习的回归问题,这里我不做多介绍,网上博客介绍很多,这里我重在数学公式和实现过程

原理

场景

对于一个回归问题,寻找一个线性模型来很好的拟合样本,且设这个线性模型函数为

$$w * x + b$$

这里的x不一定是一个数 有可能是一个矩阵

数学推导

有过机器学习的基础的应该知道,这个模型的loss函数为

$$loss = \sum_i{(w * x_{i} + b - y_{i})}^2$$

使用梯度下降法:

$$w’ = w - lr * \frac{\mathrm{𝜕}loss}{\mathrm{𝜕}w}$$

$$b’ = w - lr * \frac{\mathrm{𝜕}loss}{\mathrm{𝜕}b}$$

计算梯度后的y值

$$w’ * x + b’ → y$$

算法python实现

Step1:Compute loss

def computer_error(w, b, points):
    # 总误差
    totalError = 0
    for i in range(len(points)):
        x = points[i, 0] 
        y = points[i, 1] # 真实值

        totalError += ((w * x + b) - y)**2
    return totalError / float(len(points))

Step2:Compute Gradient and update

def step_gradient(b_current, w_current, points, learingRate):
    b_gradient = 0
    w_gradient = 0
    N = float(len(points))

    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # 对loss求b的偏导
        b_gradient += (2/N) * ((w_current * x + b_current) - y)
        # 对loss求w的偏导
        w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
    # 更新 w 和 b
    new_b = b_current - (learingRate * b_gradient)
    new_w = w_current - (learingRate * w_gradient)
    return [new_b, new_w]

Step3:Set w=w’ b = b’ and loop

def gradient_descent_runner(points, starting_b, starting_w, learningRate, num_iteration):
    b = starting_b
    w = starting_w
    # 进行num_iteration次梯度下降
    for i in range(num_iteration):
        b, w = step_gradient(b, w, np.array(points), learningRate)
    return [b, w]

有疑问 可以在博客下面留言


 上一篇
【论文阅读】A Neural Conversational Model 【论文阅读】A Neural Conversational Model
引言人工智能研究领域中对话模型是一个非常热门的话题。聊天机器人可以在各种设置中找到,包括客户服务应用和在线帮助。这些机器人通常由基于检索的模型提供支持,这些输出是某些形式问题预先定义的响应。在像公司IT服务台这样高度受限制的领域中,这些模型
2019-08-20
下一篇 
神经网络的数据表示——张量 神经网络的数据表示——张量
引言用数学量来表示物理量,可是标量加上向量,都不足以表达所有的物理量,几何代数中定义的张量是基于向量和矩阵的推广,所以就需要扩大数学量的概念,张量就出现了。 这里我将配合python的numpy库,帮助理解张量 预先环境1. numpy 2
2019-07-23
  目录