2022-09-19

作者: 扫地僧Andy | 来源:发表于2022-09-19 23:41 被阅读0次

    算法简介

    • 线性回归模型(Linear Regression),因为结构简单,可解释性好,实现简单,在工程领域得到广泛应用

    • 线性回归模型是机器学习世界的"Hello World!"。完整、全面地掌握线性回归模型,有助于打通机器学习的任督二脉

    image.png

    线性回归基础

    什么是线性?

    • 例:汽车每小时60KM3小时可以形式多长距离?
      • 已知骑车的速度,则骑车行驶的距离只与时间唯一相关
    • 特点:世界是普遍联系的,但又特例”一个事务唯一由另一个事务觉定“
    • 线性:如上例,在二元的直角坐标系中,描出这个关系的图是一条直线,所以称为线性关系

    什么是回归?

    • 起源:19世纪80年代,英国统计学家弗朗西斯.高尔顿(Francis Galton)提出
    • 研究:父代身高与子代身高之间的关系
    • 结论:子代的身高又向族群平均身高”回归的趋势“

    什么是回归分析?

    • 回归分析
      • 数理统计学中,回归分析着重在寻求变量之间近似的函数关系
    • 线性回归分析
      • 是在寻求变量之间近似的线性函数关系

    线性函数

    • 一元线性函数
      • f(x)=w_0+w_1x
      • 一元线性方程y=w_0+w_1x
    • 多元线性函数
      • f(x_1,x_2,...,x_n)=w_0+w_1x_1+w_2+x_2+...+w_nx_n=w_0+\sum\limits_{i=1}^{n}w_ix_i
      • 写成向量的形式
        • f(x_1,x_2,...,x_n)=w_0+[w_1w_2\cdots w_n]\begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}=w_0+\vec w^T\vec x

    线性回归原理

    线性回归

    • 什么是线性回归?
      • 现设在一个问题中因变量y及自变量x_1,x_2,\cdots,x_n,可以设想y的值由两部分构成:一部分,由x_1,x_2,\cdots,x_n的影响所致,这一部分表为x_1,x_2,\cdots,x_n的函数形式f(x_1,x_2,\cdots,x_n)。另一部分,则由其他众多未加考虑的因素,包括随机因素的影响,它可视为一种随机误差,记为b。于是得到模型:
        • y=f(x_1,x_2,\cdots,x_n)+b
        • 函数f(x_1,x_2,\cdots,x_n)称为yx_1,x_2,\cdots,x_n的”回归函数
          • 回归函数为线性函数的情形——称为线性回归

    线性回归理论基础

    • 一元线性回归理论基础
      • y=w_0+w_1x+b
      • 其中w_0+w_1x为回归函数,b为随机误差
      • 现在对理论模型中的变量x,y进行n次独立观察,得到样本
        • (x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)
        • 这组样本的构造可由方程y_i=w_0+w_1x_i+b_i,(i=1,2,\cdots,n)来描述,这里b_i是第i次观察时随机误差b所取得的值
    • 多元线性回归理论基础
      • y=w_0+w_1x_1+\cdots+w_nx_n+b
        • 现在对x_1,x_2,\cdots,x_ny进行观察,第i次观察时它们的取值分别记为x_1^i,x_2^i,\cdots,x_n^iy^i,随机误差b^i,得到方程
          • y^i=w_0+w_1x_1^i+w_2x_2^i+\cdots+w_nx_n^i+b^i,(i=1,\cdots,n)
          • 统一规范:x_1^i表示特征x_1的第i次观察

    线性回归模型

    • 线性回归模型公式
      • 在机器学习领域,线性回归模型记为:
      • y=w_1x_1+w_2x_2+\cdots+w_nx_n+b=[w_0w_1w_2\cdots w_n]\begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}+b
        • 则可以统一形式为:
          • y=\sum\limits_{i=1}^{n}w_ix_i+b=\vec w^T\vec x+b
            • y是预测函数
            • w是模型参数
            • x是特征输入
            • b是偏置量
    • 线性回归模型假设
      • 假设一:变量是相互无关的
        • 各变量的作用与其他变量取值无关
      • 假设二:变量的作用是可以叠加的
        • 公式中个变量是相加的

    线性回归模型损失函数

    • 损失函数的定义
      • 损失函数(Loss Function)是度量模型一次预测的好坏,即真实值(y)与预测值(\hat y)的误差
      • 线性回归损失函数:L=\frac{1}{2}(y-\hat y)^2
        • 平方损失函数衡量模型的整体准确性
        • 平方损失函数的集合意义:欧式距离
    • 损失函数的公式
      • 假设数据集有m个训练样本,n个特征工程,则平方损失函数:L(w)=\frac{1}{2}\sum\limits_{j=1}^{m}[y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b]^2

    线性回归模型训练

    • 怎样对线性回归模型的参数进行训练?
      • 训练目的:求模型参数W
        • 即求w_1,w_2,\cdots,w_n
      • 训练原理:损失函数最小
        • 即所有真实值与预测值的误差综合最小
      • 训练方法:梯度下降
        • 梯度下降公式:w_{i+1}=w_i-\alpha\nabla f,顺着损失函数当前点梯度下降反方向,按规定步长\alpha进行迭代搜索
    • 线性回归模型的梯度下降训练
      • 采样梯度下降法进行学习w_{i+1}=w_i-\alpha\frac{\partial L(\vec w)}{\partial w_i}
      • 由于\frac{\partial L(\vec w)}{\partial w_i}=-\sum\limits_{j=1}^{m}[y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b]*x_i^j
      • 则:w_{i+1}=w_i+\alpha[\sum\limits_{j=1}^{m}(y^j-\sum\limits_{i=1}^{n}w_ix_i^j-b)*x_i^j]
        • 迭代训练,计算每个参数w_i,直至收敛预定的值为止

          image.png

    线性回归应用

    线性回归的Python实现

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.array([[1, 5.56], [2, 5.70], [3, 5.91], [4, 6.40],[5, 6.80],
                  [6, 7.05], [7, 8.90], [8, 8.70],[9, 9.00], [10, 9.05]])
    m, n = np.shape(x)
    x_data = np.ones((m, n))
    x_data[:, :-1] = x[:, :-1]
    y_data = x[:, -1]
    m, n = np.shape(x_data)
    theta = np.ones(n)
    
    def gradientDescent(iter, x, y, w, alpha):
        x_train = x.transpose()
        for i in range(0, iter):
            pre = np.dot(x, w)
            loss = (pre - y)
            gradient = np.dot(x_train, loss) / m
            w = w - alpha * gradient
            cost = 1.0 / 2 * m * np.sum(np.square(np.dot(x, np.transpose(w)) - y))
            print("第{}次梯度下降损失为: {}".format(i,round(cost,2)))
        return w
    
    result = gradientDescent(1000, x_data, y_data, theta, 0.01)
    y_pre = np.dot(x_data, result)
    print("线性回归模型 w: ", result)
    
    plt.rc('font', family='Arial Unicode MS', size=14)
    plt.scatter(x[:, 0], x[:, 1], color='b', label='训练数据')
    plt.plot(x[:, 0], y_pre, color='r', label='预测数据')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('线性回归预测(梯度下降)')
    plt.legend()
    plt.show()
    
    

    线性回归的Sklearn实现

    # 数据集:Advertising
    # 模型:Linear Regression Model
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.rc('font', family='Arial Unicode MS', size=14)
    import numpy as np
    import pandas as pd
    from sklearn import datasets, linear_model
    
    # 数据处理
    data = pd.read_csv('./data/Advertising.csv')
    X = data[['TV', 'Radio', 'Newspaper']]
    y = data[['Sales']]
    
    # 划分训练集和测试集
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    
    # 求解线性模型参数
    from sklearn.linear_model import LinearRegression
    linreg = LinearRegression()
    linreg.fit(X_train, y_train)
    print(linreg.intercept_)  # 常数项 [2.87696662]
    print(linreg.coef_)       # 变量系数 [[0.04656457 0.17915812 0.00345046]]
    
    # 交叉验证
    from sklearn.model_selection import cross_val_predict
    from sklearn import metrics
    predicted = cross_val_predict(linreg, X, y, cv=10)
    print("MSE:",metrics.mean_squared_error(y, predicted))
    print("RMSE:",np.sqrt(metrics.mean_squared_error(y, predicted)))
    
    # 画图描述真实值和预测值的变化关系
    fig, ax = plt.subplots()
    ax.scatter(y, predicted)
    ax.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=5)
    ax.set_xlabel('真实值')
    ax.set_ylabel('预测值')
    plt.title('Advertising的真实值和预测值的变化关系')
    plt.show()
    
    

    线性回归的Sklearn实现

    # TensorFlow 2.0 + Linear Regression
    
    import tensorflow as tf
    import numpy as np
    
    x = np.float32(np.random.rand(100,1))
    
    # y=a*x+b
    y = np.dot(x,0.8) + 0.2
    
    a = tf.Variable(np.float32())
    b = tf.Variable(np.float32())
    
    def model(x):
        return a*x+b
    
    def loss(predicted_y, desired_y):
        return tf.reduce_sum(tf.square(predicted_y - desired_y))
    
    optimizer = tf.optimizers.Adam(0.1)
    
    for step in range(0, 100):
        with tf.GradientTape() as t:
            outputs = model(x)
            current_loss = loss(outputs, y)
            grads = t.gradient(current_loss, [a, b])
            optimizer.apply_gradients(zip(grads,[a, b]))
        if step % 10 == 0:
            print("Step:%d, loss:%2.5f, weight:%2.5f, bias:%2.5f "
                  %(step, current_loss.numpy(), a.numpy(), b.numpy()))
    
    

    线性回归总结

    线性回归价值

    • 概括了一大类实际问题
      • 现实世界中,有许多问题可以用线性回归进行抽象
    • 复杂问题近似转换(机器学习基本思想之一)
      • 因为结构简单,处理比较方便,可以近似地处理其他问题

    线性回归优缺点

    • 优点
      • 简单
      • 解释性好
      • 无法反应变量之间的相关性
      • 无法体现变量之间是相乘的

    相关文章

      网友评论

        本文标题:2022-09-19

        本文链接:https://www.haomeiwen.com/subject/kajmortx.html