机器学习——线性回归

电玩女神 2023-10-11 15:07 163阅读 0赞
  • 1.概述
  • 2.形式
  • 3.目的

1.概述

机器学习中最常见的两个问题:

  • 回归任务:在监督学习中标签值为连续值时是回归任务
  • 分类任务:在监督学习中标签值是离散值时是分类任务
    而本文要讲的就是处理回归任务最基础的模型——线性回归模型

2.形式

线性回归可以用方程y=kx+b来表示,今天我们拓展到多元的线性回归,其表现形式为:
f = w 1 x 1 + w 2 x 2 + w 3 x 3 + w n x n 即 f = ∑ i = 1 n w i x i f=w_1x_1+w_2x_2+w_3x_3+w_nx_n即f=\sum_{i=1}^{n}{w_ix_i} f=w1x1+w2x2+w3x3+wnxn即f=i=1∑nwixi

用矩阵的形式表示就是
f = w T x f=w^Tx f=wTx
其中w是
[ w 1 w 2 w 3 . . . w n ] \left[ \begin{matrix} w_1 \\ w_2\\ w_3\\ …\\ w_n \end{matrix} \right] ⎣⎢⎢⎢⎢⎡w1w2w3…wn⎦⎥⎥⎥⎥⎤
x是:
[ x 1 x 2 x 3 . . . x n ] \left[ \begin{matrix} x_1 \\ x_2\\ x_3\\ …\\ x_n \end{matrix} \right] ⎣⎢⎢⎢⎢⎡x1x2x3…xn⎦⎥⎥⎥⎥⎤
在我们使用训练模型时x矩阵是我们的输入值

3.目的

线性回归的目的就是求解出合适的w,b,在一元的情况下拟合出一条直线(多元情况下是平面或者曲面),可以近似的代表各个数据样本的标签值。所以最好的直线要距离各个样本点都很接近,而如何求出这条直线就是本篇文章重点要将的内容。

  • 需要拟合的曲线:
    在这里插入图片描述

未训练之前以及训练之后的曲线:
在这里插入图片描述

求解线性回归模型的方法叫做最小二乘法,最小二乘法的核心就是保证所有数据偏差的平方和最小。而这个函数就是我们定义的损失函数,它的具体形式是:
在这里插入图片描述

求解最小二乘法的方法一般有两种方法:矩阵式和梯度下降法
下面我具体讲解一下我们最常用的梯度下降法:
我们以下面这个二次函数:
y = ( x − 2 ) 2 + 2 y=(x-2)^2+2 y=(x−2)2+2
在这里插入图片描述

d y d x = 2 x − 4 \frac{dy}{dx}=2x-4 dxdy=2x−4
x 1 = x 0 − d y d x ∣ x = x 0 x_1=x_0-\frac{dy}{dx}|x=x_0 x1=x0−dxdy∣x=x0
x 0 = 0 时 d y d x ∣ x 0 = − 4 x_0=0时\frac{dy}{dx}|x_0=-4 x0=0时dxdy∣x0=−4

  • 由 d y d x ∣ x 0 = − 4 \frac{dy}{dx}|x_0=-4 dxdy∣x0=−4说明是下降的,此时我们继续向右移动
  • x 1 = x 0 − d y d x ∣ x 0 x_1=x_0-\frac{dy}{dx}|x_0 x1=x0−dxdy∣x0
    经过计算我们可以得出 x 1 = 4 x_1=4 x1=4由此得出我们找的下一个点是x=4但是我们通过图像我们很容看出x=0和x=4处的斜率方向是相反的,这种方式选取的点跨度太大,由此我们引入学习率 η \eta η
    将我们选择点的公式稍作变形为 x 1 = x 0 − η d y d x ∣ x = x 0 x_1=x0-\eta\frac{dy}{dx}|x=x_0 x1=x0−ηdxdy∣x=x0
  • 我们选取 η = 0.01 \eta=0.01 η=0.01经过计算 x 1 = 0 − ( 0.01 ∗ − 4 ) = 0.04 x_1=0-(0.01*-4)=0.04 x1=0−(0.01∗−4)=0.04于是我们选择0.04这个点作为第二个下降的点,依此类推,我们要找到 d y d x = 0 \frac{dy}{dx}=0 dxdy=0的点或 d y d x 无 限 接 近 0 的 点 \frac{dy}{dx}无限接近0的点 dxdy无限接近0的点,也就是极小值点
    至此梯度下将就结束了,下面附上线性回归的代码:

    import matplotlib.pyplot as plt
    import tensorflow as tf
    import time

    TRRE_W = 3.0
    TRUE_b = 5.0
    NUM_SAMPLES = 100

    初始化随机数据

    X = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy() # 生成一个正态分布的100行,一列的矩阵
    noise = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy()
    y = X * TRRE_W + TRUE_b + noise # 添加噪声
    plt.scatter(X, y)
    plt.show()

  1. # 接下来我们定义线性回归模型
  2. # f(w,b,x)=w*x+b
  3. class Model(object):
  4. def __init__(self):
  5. # 随机初始化参数
  6. self.w = tf.Variable(tf.random.uniform([1]))
  7. self.b = tf.Variable(tf.random.uniform([1]))
  8. def __call__(self, x):
  9. return self.w * x + self.b
  10. # 先实例化模型
  11. model = Model()
  12. plt.scatter(X, y)
  13. plt.plot(X, model(X), c='r') # 绘制折现图
  14. # 上面的曲线并不能 够很好的拟合我们的数据,我们接下来定义损失函数
  15. # Loss(w,vb,x,y)=[f(w,b,x)-y]^2
  16. def Loss(model, x, y):
  17. y_ = model(x)
  18. return tf.reduce_mean(tf.square(y_ - y))
  19. # 通过梯度下降进行迭代,降低损失
  20. EPOCHS = 1000 # 定义训练次数
  21. LEARNING_RATE = 0.01 # 定义学习率
  22. for epoch in range(EPOCHS):
  23. with tf.GradientTape() as tape:
  24. loss = Loss(model, X, y)
  25. dw, db = tape.gradient(loss, [model.w, model.b])
  26. model.w.assign_sub(LEARNING_RATE * dw)
  27. model.b.assign_sub(LEARNING_RATE * db)
  28. print("Epoch:[{}/{}],loss:[{:.3f}],w/b:[{:.3f}/{:.3f}]".format(epoch, EPOCHS, loss, float(model.w.numpy()),
  29. float(model.b.numpy())))
  30. plt.scatter(X, y)
  31. plt.plot(X, model(X), c="purple")
  32. plt.show()

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读

    相关 机器学习 --- 线性回归

    线性回归是属于机器学习里面的监督学习,与分类问题不同的是,在回归问题中,其目标是通过对训练样本的学习,得到从样本特征到样本标签直接的映射,其中,在回归问题中,样本的标签是连续值

    相关 机器学习线性回归

    花了2天时间看了吴恩达老师的机器学习算法的第一章,收获很多,在网易云课堂上可看,虽然是英文版的,且偏向于理论,故在此记录下学习收获和代码实现。 1.y=kx+b的线性回归

    相关 机器学习线性回归

    单变量线性回归 说到机器学习的话,很多人首先会想到的是单变量的线性回归,好像大家高中的时候都学过。很多人不理解,这种线性回归的东西跟机器学习有什么关系。 其实单变量的话

    相关 机器学习_线性回归

    这学期打算把机器学习和深度学习 什么是回归算法 1. 回归算法是一种有监督算法(有一个x和y的对应关系) 2. 回归算法是一种比较常用的机器学习算法,用来建立“解释