【机器学习(三)】回归模型之线性回归详解

发布于:2025-08-03 ⋅ 阅读:(10) ⋅ 点赞:(0)

目录

一、写在前面的话

1.1 前言导览

1.2 分类与回归

1.3 数据的类型

1.3.1 标称型数据(Nominal Data)

1.3.2 连续型数据(Continuous Data)

二、基础知识铺垫

2.1 回归的概念

2.2 矩阵与矩阵运算

2.2.1 矩阵概念

2.2.2 矩阵基本介绍

(1)矩阵加法

(2)矩阵数乘

(3)矩阵乘法

(4)转置(Transpose)

(5)单位矩阵

(6)逆矩阵

2.3.3 矩阵运算性质

(1)基本运算性质

(2)转置性质

(3)逆矩阵性质

(4)单位矩阵

2.3.4 矩阵求导法则

(1)常用求导公式

(2)关于链式法则求导

2.3.5 矩阵除法的实现

三、线性回归详解

3.1 基本概念

3.1.1 概念介绍

3.1.2 概念引入

3.2 损失函数

3.2.1 承接上文

3.2.2 损失函数

(1)分类

(2)常用

3.3 多参数回归(Multivariate Linear Regression)

3.3.1 概念

3.3.2 解决方法

(1)正规方程(Normal Equation)【闭式解】

(2)梯度下降法(Gradient Descent)【数值解】

(3)正则化回归(防止过拟合)

3.4 关于正规方程闭式解

3.4.1 最小二乘法(Least Squares Method)

(1)概念

(2)引入

(3)公式

3.4.2 公式推导

3.4.3 最小二乘法代码示例

3.5 代码示例


一、写在前面的话

1.1 前言导览

        “线性回归是理解所有监督学习算法的钥匙”,在机器学习中,线性回归是相对来说最方便初学者入门的回归算法类型,因此我们从这里开始进行学习。结合上之前讲的KNN分类算法,通过学习两个分别代表着分类与回归的基础算法,我们可以更全面更深入地理解机器学习中的模型训练阶段。接下来文章将从基础性概念开始讲解,而后主要分析有关线性回归的概念和知识。

1.2 分类与回归

模型训练阶段(Model Training Phase)是指通过已有数据让模型学习如何进行预测或分类的过程,“分类(Classification)”与“回归(Regression)”是其中的两种基本任务类型,依据我们想预测的“目标变量(也叫输出变量)”的类型而区分。

  • 分类的任务是:预测一个离散的类别标签输出是有限个类别中的一个
  • 回归任务的目标是:预测一个连续的数值型结果,输出是一个数值结果

回归一词最早来源于统计学,表示“变量间的关系”。在机器学习中,我们学习一个函数 f(x) 近似表示输入 x 与输出 y 之间的关系,使得输出尽可能接近真实值。

回归分析:建立连续型变量之间的数学关系,预测一个或多个自变量如何影响因变量。

1.3 数据的类型

分类的目标变量是标称型数据,回归是对连续型数据做出预测。

1.3.1 标称型数据(Nominal Data)

概念:用于分类或标记不同的类别或组别,数据点之间并没有数值意义上的距离或顺序。例如,颜色(红、蓝、绿)、性别(男、女)或产品类别(A、B、C)。

特点

  1. 无序性:标称数据的各个类别之间没有固有的顺序关系。例如,“性别”可以分为“男”和“女”,但“男”和“女”之间不存在大小、高低等顺序关系。
  2. 非数值性:标称数据不能进行数学运算,因为它们没有数值含义。你不能对“颜色”或“品牌”这样的标称数据进行加减乘除。
  3. 多样性:标称数据可以有很多不同的类别,具体取决于研究的主题或数据收集的目的。

1.3.2 连续型数据(Continuous Data)

概念:表示在某个范围内可以取任意数值的测量,这些数据点之间有明确的数值关系和距离。例如,温度、高度、重量等。

特点

  1. 可测量性:连续型数据通常来源于物理测量,如长度、重量、温度、时间等,这些量是可以精确测量的。
  2. 无限可分性:连续型数据的取值范围理论上是无限可分的,可以无限精确地细分。例如,你可以测量一个物体的长度为2.5米,也可以更精确地测量为2.53米,甚至2.5376米,等等。
  3. 数值运算:连续型数据可以进行数学运算,如加、减、乘、除以及求平均值、中位数、标准差等统计量。

二、基础知识铺垫

2.1 回归的概念

        回归方程是用于表达输入变量(自变量)与输出变量(因变量)之间的关系的一种数学模型,比方说 y = ax + b ,其中 a , b 是方程的系数,求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做出预测就非常容易了,所以我们的模型训练的目的可以看作是求解这些回归系数的过程。

2.2 矩阵与矩阵运算

矩阵是描述和操作线性空间的基本工具,是线性代数中最重要的结构之一。

2.2.1 矩阵概念

(1)矩阵可用于表达线性方程:

(2)在机器学习中,矩阵的每行表示一个样本,每列表示一个特征。

(3)在图像处理中,图片的每个像素就是矩阵的一个元素。

(4)特殊矩阵有:零矩阵、对角矩阵、单位矩阵、对称矩阵、稀疏矩阵、转置矩阵等。

2.2.2 矩阵基本介绍

(1)矩阵加法

前提条件:两个矩阵维度相同。

方法:对应位置元素相加或相减。

(2)矩阵数乘

即数与矩阵的乘法,每个元素对应乘上一个标量即可:

(3)矩阵乘法

条件:矩阵 A 的列数 = 矩阵 B 的行数。

方法:第行点乘第列,得到新矩阵的第 ( i , j ) 元素。

设 A 为 m×n 矩阵,B 为 n×p 矩阵,那么乘积 C = A B 是一个 m×p 矩阵。

例子1:

例子2:

(4)转置(Transpose)

将原矩阵的行 “变成” 列,列 “变成” 行:

(5)单位矩阵

单位矩阵:主对角线元素均为 1,其余元素均为 0

  • 单位矩阵是对称矩阵,其转置等于自身

示例

(6)逆矩阵

定义

示例

2.3.3 矩阵运算性质

(1)基本运算性质
性质名称 表达式 说明
加法交换律 A+B = B+A 矩阵加法可交换
加法结合律 (A+B) + C = A + (B+C)
乘法结合律 A(BC) = (AB)C 注意乘法不交换,但结合
乘法分配律 A(B+C) = AB + AC
标量分配律 α(A+B) = αA + αB
(2)转置性质

(3)逆矩阵性质

仅对可逆方阵成立:

(4)单位矩阵

2.3.4 矩阵求导法则

矩阵的偏导公式在机器学习的梯度下降反向传播中非常常见。

(1)常用求导公式

(2)关于链式法则求导

2.3.5 矩阵除法的实现

线性代数中,没有真正意义上的“矩阵除法”,因为矩阵不像数那样有一般的“除法”操作。但我们可以用其他方式来实现类似“除法”的效果。

假设我们要求解的是:AX = B,令其左右两边都同左乘A的逆矩阵:

三、线性回归详解

3.1 基本概念

3.1.1 概念介绍

线性回归是一种最基础的监督学习算法,用于回归问题,即预测一个连续数值的输出。其目标是:
找出输入特征 x 和输出目标值 y 之间的一个线性关系。

3.1.2 概念引入

假设理想情况下,在森林中随机选择了一些树木,其高度 Y 与生长时间 X 存在正相关关系,统计成(X,Y)的格式,将其坐标点标在坐标图上:

数据:[4.2, 3.8],[4.2, 2.7],[2.7, 2.4],[0.8, 1.0],[3.7, 2.8],[1.7, 0.9],[3.2, 2.9]

我们的目的就是通过这些散点来拟合一条直线,使该直线能尽可能准确的描述 X 与 Y 的关系,这样的话我们就可以通过树木的生长年龄大概判断其生长高度了。

于是我们假定线性模型:Y = wX +b 用来描述是最合适的,此处暂且使 b = 0,那么通过不同的 w(权重系数) 我们可以得到不同的直线,如下方的图,我们可以感觉出:红色实线最接近实际数据点。

其实我们的模型训练的最终目的,就是要确定模型参数(如上面的 w ),找出最合适的值也就是完成了对模型的初步训练。

3.2 损失函数

3.2.1 承接上文

那么,我们如何能够得出上图中红色的直线呢,这就要引入一个概念:损失函数。通过计算最小损失能够让我们确定下来我们所需要的模型参数。

在机器学习中,损失函数(Loss Function)是一个非常核心的概念,它用来衡量模型预测值和真实值之间的差距。我们希望通过不断优化损失函数,让模型输出的预测结果越来越接近真实数据。

这里我们令直线的方程为 Y = wX + b,对于同水平值 X 代入所得出的结果我们记为 Y^

如下图,其含义为 Y 代表 X 对应的真实值即真实的生长高度,而我们通过线性模型预测得出的 Y^ 代表着模型的预测值,其差距就是 (Y^ - Y)。如果能使得这个差值越小,就说明我们的预测直线离实际的数据点越接近,我们的预测模型就越准确。

由于数据点可能分布在直线上下两侧,那么差值可能为负数,因此我们不妨给其加上平方:(Y^ - Y)^2,令其为水平值为X时,对应的差距平方值 e (X)。将其全部的对应值加起来,就是我们的损失函数

至此,我们就可以去求取 e(X) 的最小值来达到我们的最初目的:找到最合适的拟合直线。

把x_1, x_2, x_3 ... 带入进去 然后得出:

y_1 = w*x_1 + b

y_2 = w*x_2 + b

y_3 = w*x_3 + b

……

这里先假定 b = 0 ,最简化我们的计算过程:

这就是一个简单的抛物线求极值的问题了,求得 w=0.795 时损失函数取得最小值。

于是拟合直线也就确定了下来,我们成功得到了一个简单的直线预测模型 Y = 0.795 * X

3.2.2 损失函数

上面所使用到的 e (X) 我们称为均方差损失(Mean Squared Error,MSE)

我们主要介绍一下损失函数的大概分类,以及常用的几个损失函数。

(1)分类
损失函数 类型 特点/适用场景
MSE 回归 惩罚大误差严重,平滑
MAE 回归 鲁棒,对异常值不敏感
Huber 回归 综合 MSE 和 MAE
Log-Cosh 回归 平滑、对异常值较稳健
Cross Entropy 分类 标准分类损失,适合 softmax 输出
KL 散度 分类 比较两个概率分布
Focal Loss 分类 类别不平衡问题
Hinge Loss 分类 SVM 专用损失函数
Contrastive Loss 度量学习 判断样本是否相似
Triplet Loss 度量学习 学习嵌入空间中样本之间的相对距离
CTC Loss 序列任务 可变长输入输出的对齐
(2)常用
  • 均方误差(MSE,Mean Squared Error):平滑、可导,适合梯度下降

  • 平均绝对误差(MAE,Mean Absolute Error):比 MSE 更鲁棒(不太受离群值影响)

  • 交叉熵损失(Cross Entropy Loss):C 是类别数,适用几乎所有的分类任务

3.3 多参数回归(Multivariate Linear Regression)

在实际情况下,往往影响结果 y 的因素不止1个,这时x就从一个变成了n个,x_1, x_2, x_3 ... x_n, 上面的思路是对的,但是求解的公式就不再适用了,这时候就要分析多参数的回归情况了(也叫多元线性回归)。

3.3.1 概念

定义:当我们有多个输入变量(特征)时,用来拟合一个连续输出变量 y 的模型。

回归方程形式

我们可以进一步用矩阵来表示:

W = [ w1, w2, ... , wn, b ],X = [ x1, x2, ... , xn ],则可简化为 Y^  =  WT × X

3.3.2 解决方法

对于多参数的回归我们可以使用如下的方法:

(1)正规方程(Normal Equation)【闭式解】

一种不用迭代的方法,直接用线性代数解出最优解(一般不推荐这个方法):

  • 优点:计算表达式简单、直接,数学上很严谨
  • 缺点:当特征很多时计算量较大,对内存要求高

(2)梯度下降法(Gradient Descent)【数值解】

不断迭代优化权重 w ,使损失函数最小,常用的损失函数是 均方误差(MSE):

  • 优点:适合高维数据、容易扩展
  • 缺点:需要选择合适的学习率、可能陷入局部最优

权重更新规则

  • α:学习率,标量

  • ∇ J :损失函数对 w 的梯度

    (3)正则化回归(防止过拟合)

    1、Ridge 回归(L2 正则):

    • 平滑权重,防止过拟合

    2、Lasso 回归(L1 正则)

    • 可以做特征选择(将一些 w 变为 0)

    3.4 关于正规方程闭式解

    3.4.1 最小二乘法(Least Squares Method)

    (1)概念

    最小二乘法是一种用于拟合线性模型的方法,它的目标是让模型预测值与实际值之间的误差的平方和最小。它是线性回归的核心思想之一,用于确定最佳回归直线(或超平面)对应的参数。

    (2)引入

    给定数据集:

    要找到一条直线:

    使得所有预测值 y^ 与实际值 y 的误差尽可能小。

    我们使用均方差损失来确定模型系数,那么,最小二乘法目标就是求解:

    最小二乘损失函数(MSE):

    (3)公式

    对于多参数线性回归,其最优解为:

    这是一个闭式解,可以直接解出,不需要迭代。

    3.4.2 公式推导

    这一部分需要用到之前的基础知识,不是很理解的读者也可以跳过这一部分,不影响后续内容。

    已知损失函数:

    参考上一节,我们需要得到 :Y^  =  WT × X

    让W = [ w1, w2, ... , wn, b ],为了将偏置 b 包含在矩阵运算中,我们通常在输入特征矩阵 X 中添加一列全为 1 的截距项(intercept term)。新的输入特征矩阵 X 变为 m ×(n+1) 的矩阵:

    这样,参数向量 W 中的偏置 b 可以与权重 w 一起通过矩阵乘法进行计算。

    那么便有:

    即推导出:

    3.4.3 最小二乘法代码示例

    # 最小二乘法
    
    from sklearn.linear_model import LinearRegression
    import numpy as np
    data = np.array([[]])
    
    x = data[:,:-1]
    y = data[:,-1]
    model = LinearRegression(fit_intercept=False)
    # XW = Y
    model.fit(x,y)  # 训练模型
    print("模型系数:",model.coef_)  # 模型系数,W矩阵
    print("模型截距:",model.intercept_)  # b也即w0
    
    score = model.score(x,y)
    print("准确率:",score)

    3.5 代码示例

    from sklearn.linear_model import LinearRegression
    import numpy as np
    data=np.array([[  0, 14, 8,  0,  5,-2,  9,-3, 399],
                   [ -4, 10, 6,  4,-14,-2,-14, 8,-144],
                   [ -1, -6, 5,-12,  3,-3,  2,-2,  30],
                   [  5, -2, 3, 10,  5,11,  4,-8, 126],
                   [-15,-15,-8,-15,  7,-4,-12, 2,-395],
                   [ 11,-10,-2,  4,  3,-9, -6, 7, -87],
                   [-14,  0, 4, -3,  5,10, 13, 7, 422],
                   [ -3, -7,-2, -8,  0,-6, -5,-9,-309]])
    
    x=data[:,:-1]
    y=data[:,-1]
    print(x)
    print(y)
    
    # 创建模型
    model=LinearRegression(fit_intercept=False)
    model.fit(x,y)  # 训练
    print(model.coef_)
    print(model.intercept_)
    
    # 进行预测
    y_pred=model.predict([[0,14,8,0,5,-2,9,-3],
                   [-4,10,6,4,-14,-2,-14,8],
                   [-1,-6,5,-12,3,-3,2,-2],
                   [5,-2,3,10,5,11,4,-8],
                   [-15,-15,-8,-15,7,-4,-12,2],
                   [11,-10,-2,4,3,-9,-6,7],
                   [-14,0,4,-3,5,10,13,7],
                   [-3,-7,-2,-8,0,-6,-5,-9]])
    print(y_pred)  # 预测值

    END


    网站公告

    今日签到

    点亮在社区的每一天
    去签到