0
点赞
收藏
分享

微信扫一扫

机器学习__线性回归

问题引入

现有一组训练数据train_xtrain_y:

train_x = [1, 2, 3, 5, 6]
train_y = [2, 4, 5, 7, 9]

执行下述代码后

mp.scatter(train_x, train_y)
mp.show()

得到散点图:
在这里插入图片描述
通过观察我们可以发现, 训练集中的5个点近似分布在一条直线上, 我们将这条直线用y = w0 + w1*x表示. 线性回归的目的, 就是求出一组合适的w0w1

损失函数

我们如何判断求得的w0w1是否合适呢? 显然, 我们求得的直线应该尽可能地靠近训练集中的5个点.
我们用损失函数loss_function来描述数据"靠近"回归直线的程度.
假设对于某一个x, x对应的值为y, 我们将’x’带入直线方程中得到为y', 则损失定义为0.5*(y'-y)^2, 即0.5*(w0+w1*x-y)^2. 损失函数即为全部数据损失的和.
此时, 问题转化成了: 如何求得一组w0w1, 使得损失函数取得极小值.

梯度下降法

梯度下降法能够帮助我们高效地找到损失函数的极小值(或近似极小值), 思路如下:

  1. 规定梯度下降次数times和学习率lrate
times = 1000
lrate = 0.01
  1. 随机选择一组w0w1的取值
w0, w1 = 1, 1
  1. w0w1分别求偏导数d0d1
d0 = (w0 + w1 * train_x - train_y).sum()
d1 = (train_x * (w0 + w1*train_x - train_y)).sum()
  1. 更新w0w1的值
w0 = w0 - lrate*d0
w1 = w1 - lrate*d1
  1. 重复步骤3,4, 次数为times
完整代码
times = 1000
lrate = 0.01
w0, w1 = 1, 1
for i in range(0, times):
    d0 = (w0 + w1 * train_x - train_y).sum()
    d1 = (train_x * (w0 + w1*train_x - train_y)).sum()
    w0 = w0 - lrate * d0
    w1 = w1 - lrate * d1
print("w0=", w0)
print("w1=", w1)
# w0= 1.0116288204591268
# w1= 1.2906974643094398

得到的回归直线如下图所示:
在这里插入图片描述

举报

相关推荐

0 条评论