机器学习入门(二)线性回归

在上一篇文章 机器学习入门(一)什么是机器学习 中,提到过,机器学习一般分为监督学习、无监督学习、半监督学习以及强化学习四种。这篇文章将介绍监督学习中的线性回归算法。

单因子的线性回归

回归分析 是指根据数据,确定两种或两种以上变量间相互依赖的定量关系。而线性回归顾名思义就是变量之间呈线性的关系。这里以房价和房子的大小的关系为例,一般房子越大,其房价就越贵,如下图所示:

因此我们可以假设房价和房子的关系为 y ^ i = β ^ 0 x + β ^ 1 \hat{y}_i = \hat{\beta}_0x + \hat{\beta}_1 y^i=β^0x+β^1,可以看到现在的线性回归就是我们初中学习的二元一次方程。而我们的目的就是求出该函数的 β ^ 0 \hat{\beta}_0 β^0 和 β ^ 1 \hat{\beta}_1 β^1 的值。但是,现实中数据都不是精确的,它可能会受到其他因素的影响,比如说,房价除了面积外,还受其房子年龄、周边人口等。这样就导致了,现实世界中的数据是一个个的散点图,我们无法使用一条直线完全拟合图中的数据点。

如上图所示,我们画了三条线来拟合数据,但是这三条线中哪一条更好呢?从图中可以看到,貌似是红色的直线更加拟合,但是这种目测的方式非常不准确。这时我们就可以使用损失函数来评判哪一条直线更加拟合。

损失函数

损失函数是衡量回归模型误差的函数,也就是我们要的"直线"的评价标准。这个函数的值越小,说明直线越能拟合我们的数据。

在回归算法中,一般使用残差平方和来作为损失函数,如下图所示。

残差平方和的公式为: RSS = ∑ i = 1 n ( y i − y ^ i ) 2 \text{RSS} = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 RSS=∑i=1n(yi−y^i)2

把公式展开后,可以发现它其实是一个二次方程。如下图所示:

由于 y ^ i = β ^ 0 x + β ^ 1 \hat{y}_i = \hat{\beta}_0x + \hat{\beta}_1 y^i=β^0x+β^1 中的 β ^ 0 \hat{\beta}_0 β^0 和 β ^ 1 \hat{\beta}_1 β^1 都是未知变量,因此其画出来的是三维图形:

从图中可以看出,其最低点就是该损失函数的最小值。根据大学的微积分知识,当导数为0时,就是该函数的极小值点。因此我们分别对 β ^ 0 \hat{\beta}_0 β^0和 β ^ 1 \hat{\beta}_1 β^1求偏导并令其为0:

这样就可以求出 β ^ 0 \hat{\beta}_0 β^0和 β ^ 1 \hat{\beta}_1 β^1的值了。

上文中这种求极小值的方法叫做梯度下降法,关于梯度下降更详细的解释可以看 Gradient-Descent

scikit-learn

scikit-learn 是 python 中专门针对机器学习应用而发展起来的一款开源框架(算法库),开源实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。但是不支持python以外的语言,也不支持深度学习和强化学习。

代替手动计算 β ^ 0 \hat{\beta}_0 β^0和 β ^ 1 \hat{\beta}_1 β^1的值,我们可以直接使用 scikit-learn 库。代码示例如下:

python 复制代码
from sklearn.linear_model import LinearRegression

# 创建一个 LinearRegression 类的实例,命名为 lr_model
lr_model = LinearRegression()
# 使用 fit 方法对线性回归模型进行训练
lr_model.fit(x, y)
# 斜率(系数)
a = lr_model.coef_
# 获取线性回归模型的截距
b = lr_model.intercept_

把获取到的直线绘制出来,其效果如下图所示:

多因子的线性回归

上面考虑的只是房子大小单个因子对房价的影响,但是现实世界不可能只有一个影响因素,而是多个。假设房价由两个因素影响,分别是房子大小和房子年龄。那么假设房价与房子大小和房子年龄的关系为: y ^ i = β ^ 0 x 0 + β ^ 1 x 1 + β ^ 2 \hat{y}_i = \hat{\beta}_0x_0 + \hat{\beta}_1x_1 + \hat{\beta}_2 y^i=β^0x0+β^1x1+β^2 其中, x 0 x_0 x0 表示房子大小, x 1 x_1 x1表示房子年龄。

其对应的损失函数仍为: RSS = ∑ i = 1 n ( y i − y ^ i ) 2 \text{RSS} = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 RSS=∑i=1n(yi−y^i)2 ,区别是 y ^ i = β ^ 0 x 0 + β ^ 1 x 1 + β ^ 2 \hat{y}_i = \hat{\beta}_0x_0 + \hat{\beta}_1x_1 + \hat{\beta}_2 y^i=β^0x0+β^1x1+β^2。

同样,对于多因子的线性回归,我们可以使用scikit-learn库来计算。代码示例如下:

python 复制代码
from sklearn.metrics import mean_squared_error,r2_score
# 使用线性回归模型
from sklearn.linear_model import LinearRegression
lr_model_multi = LinearRegression()
# 一样使用 fit 方法,区别是 多因子的线性回归 传入的 x_multi 是多维数组
lr_model_multi.fit(x_multi, y)
# 输出数组,比如: [1. 1.](每个特征一个系数)
print("斜率(系数):", model_multi.coef_)  
print("截距:", model_multi.intercept_)    

参考

相关推荐
让学习成为一种生活方式1 小时前
黄花蒿LHC基因家族的串联重复驱动扩张及其UV-B胁迫适应性--BMC Plant Biology
人工智能·算法·机器学习
ECT-OS-JiuHuaShan2 小时前
共轭互逆链路论,彻底打击庸俗辩证法和不可知论
数据库·人工智能·算法·机器学习·数学建模
薛定e的猫咪2 小时前
【源码解读版】ContraBAR:用 CPC 对比学习替代变分推断做贝叶斯元 RL
人工智能·深度学习·学习·算法·机器学习
征尘bjajmd2 小时前
黑马AI大模型机器学习课程笔记(个人记录、仅供参考)
人工智能·笔记·机器学习
xier_ran15 小时前
【infra之路】AWQ 详解:激活感知权重保护,让 W4A16 量化精度超越 GPTQ
线性代数·算法·机器学习·量化·infra
亦皓ai15 小时前
AI时代后端工程(二):AI把代码写得越来越快,我却越来越不敢让它直接开工了
人工智能·算法·机器学习·搜索引擎·transformer
咖啡星人k16 小时前
2026 AI Agent 长期记忆:为什么 AI 助手总“聊完就忘“?MonkeyCode 免费上手
人工智能·深度学习·机器学习·语言模型·自然语言处理
Rocky Ding*17 小时前
一文读懂Wan 3.0视频创作大模型核心基础知识
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·wan 3.0
我叫孙一鸣-专注电子元器件18 小时前
自动驾驶的眼睛正在换代:激光雷达的“小镜子”正在改变未来
人工智能·机器学习·自动驾驶·卫星通讯·压电驱动器
richard_first19 小时前
Transformer 与大语言模型:第10章 Residual (残差连接)
人工智能·深度学习·机器学习·transformer