news 2026/7/26 9:17:49

05-线性回归概述

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
05-线性回归概述

1. 概念

线性回归:利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模的分析方式。

线性回归要求解需要:

  • 数据:特征x + 目标y,y连续
  • 线性方程式:一元、多元
  • 损失函数种类:MAE、MSE、RMSE
  • 优化方法:正规方程法(求导、求偏导)、梯度下降法
  • 过拟合、欠拟合调整:
    • 过拟合:减少特征;增加样本量;L1、L2正则化
    • 欠拟合:增加特征

1.1 一元线性回归

1个目标值,1个特征值

公式:,k是权重,b是偏置

1.2 多元线性回归

1个目标值,n个特征值

公式:是权重,是偏置;

2. API

# 包 from sklearn.linear_model import LinearRegression from sklearn.linear_model import SGDRegressor from sklean.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error # 1. 模型训练(正规方程/梯度下降 二选一) estimator = LinearRegression(fit_intercept = True) # 正规方程 estimator = SGDRegressor(fit_intercept = True, learning_rate = "constant", eta0 = 0.01) # 梯度下降 estimator.fit(x_train,y_train) # 2. 模型预测 y_pre = estimator.predict(x_test) print(f"预测值为:{y_pre}") print(f"权重系数为:{estimator.coef_}") print(f"偏置为:{estimator.intercept_}") # 3. 模型评估 mse = mean_squared_error(y_test, y_pre) mae = mean_absolute_error(y_test, y_pre) rmse = root_mean_squared_error(y_test,y_pre)

3. 损失函数

误差=预测值-真实值

损失函数(代价函数/成本函数/目标函数):衡量每个样本预测值与真实值效果的函数。找到损失函数的最小值,就找到了线性回归的最优拟合(得到的权重就是最优解)。

要想一条直线更好地拟合所有点:

  • 引入损失函数
  • 通过一个优化方法,求最小值,得到的最优解

损失函数分类:

  • 最小二乘法:误差平方和

  • 均方误差(Mean-Square Error, MSE)

  • 平均绝对误差(Mean Absolute Error, MAE)

  • 均方根误差(Root Mean Absolute Error, RMSE),MSE开根号

4. 优化方法

正规方程法 VS 梯度下降法
正规方程法梯度下降法
  1. 不需要学习率
  2. 一次运算即可得到结果,不需要迭代
  3. 应用于小数据量场景
  4. 计算量大,易受噪声、特征相关性等影响
  5. 计算非常耗时,且不存在时,无法求解
  6. 如果数据不是线性规律,无法使用/效果不好
  1. 需要选择学习率
  2. 需要迭代
  3. 适用于嘈杂、大数据应用场景
  4. 在各种损失函数求解中被大量应用

4.1 正规方程法(求导、求偏导)

4.1.1 原理

设线性回归模型:

损失函数(这里用最小二乘损失):

目标:找到使得最小。

  • 关于的二次凸函数,二次项半正定,全局只有一个极小值 = 全局最小值;
  • 多元可微凸函数取最小值的充要条件:梯度 = 0 向量
  • 对损失函数求梯度,令梯度等于 0,直接解出最优,这个方程就是正规方程(Normal Equation)

损失函数取最小值时的参数解析解:

存在的问题:

  • 如果运算量过大,可能造成内存溢出
  • 该方法需要假设逆矩阵存在,如果不存在(即不是正定矩阵,即不是列满秩矩阵,即特征之间存在多重共线性),则存在无穷多组使得最小,一般用岭回归加正则项来达成目标。

4.1.2 一元线性回归

将损失函数求导,如

对b求偏导:

对k求偏导:

,带入

4.1.3 多元线性回归

4.1.4 API

from sklearn.linear_model import LinearRegression estimator = LinearRegression(fit_intercept=True) # 含偏置,默认True

属性:

  • LinearRegression.coef_:回归系数
  • LinearRegression.intercept_:偏置

4.2 梯度下降法

4.2.1 原理

沿梯度下降的方向求解极小值。

步骤:

  1. 输入:初始化位置S,每步距离为(学习率),输出:从S到达山底
  2. S为任意位置
  3. 在S环顾四周,如果四周都比S高,则返回S,终止;否则继续下一个步骤
  4. 在S环顾四周,寻找坡度最抖的方向,令其为x方向
  5. 沿x方向往下走,长度为,到达新的位置S
  6. 重复上述步骤,直到收敛

梯度:

  • 单变量函数:梯度是某一点切线斜率(某一点导数),方向为函数增长最快的方向
  • 多变量函数:某一个点的偏导,方向为偏导分量的方向

梯度下降:

  • 循环迭代求当前点的梯度,更新当前的权重参数。下个点=当前点-学习率*损失函数求偏导:

  • 学习率(步长):一般为0.001~0.01

4.2.2 梯度下降算法分类

  • 全梯度下降算法 FGD (Full Gradient Desent)
    • 每次迭代时,使用全部样本的梯度值
    • 训练速度慢
  • 随机梯度下降算法 SGD
    • 每次迭代时,随机选择使用1个样本梯度值
    • 简单、高效、不稳定
  • 小批量梯度下降算法 mini-batch
    • 每次迭代时,在m个样本中随机选择使用x个样本梯度值(1<x<m)
    • x=1,即为SGD
    • x=m,即为FGD
    • 结合了FG的心细和SG的胆大,目前使用最多
  • 随机平均梯度下降算法 SAG
    • 每次迭代时,随机选择1个样本的梯度值和以往样本的梯度值的均值
    • 训练初期表现不佳,优化速度慢

4.2.3 单变量梯度下降

4.2.4 多变量梯度下降

数据说明:

  • 样本:8条
  • 特征:3个,每月工资、存款余额、房产面积
  • 标签:1个,授信额度

假设函数:

将b换成,其中

其中:.

损失函数(最小二乘):

梯度下降公式:

其中,为第j个特征的第s次迭代权重,为学习率,为损失函数的偏导数(梯度)。

则更新梯度下降公式为:

设置初始位置(s=0):,则:

其中,时:

以此类推,一直算到,即可求出的值,得到的第1次迭代位置,然后重复上述步骤,直到收敛,得到最优

其他的也是同样的计算方式,最终得到1个权重向量,求解结束。

4.2.5 API

from sklearn.linear_model import SGDRegressor # 随机梯度下降算法 estimator = SGDRegressor( loss = "squared_loss", # 损失函数类型 fit_intercept = True, # 是否含偏置 learning_rate = "constant", # 学习率策略,默认为常数;也可以不断变小"invscaling" eta0 = 0.01 # 学习率大小 )

属性:

  • SGDRegressor.coef_:回归系数
  • SGDRegressor.intercept_:偏置

5. 线性回归模型评估

衡量预测值与真实值之间的差距。(公式见本文:损失函数)

  • 平均绝对误差 MAE
  • 均方误差 MSE
    • 给出平均误差
  • 均方根误差 RMSE
    • 计算公式中有平方项,误差可能会被放大,对异常值更敏感
    • 一般情况下:MAE<RMSE
    • 如果RMSE指标训练地非常低,说明模型对异常点(噪声)的拟合非常好,模型容易过拟合

以上指标值越小模型预测越准确。(一般用MAE、RMSE结合着看

API:

from sklean.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error mae = mean_absolute_error(y_test,y_pre) mse = mean_squared_error(y_test,y_pre) rmse = root_mean_squared_error(y_test,y_pre)

6. 过拟合、欠拟合

6.1 欠拟合

  • 模型在训练集、测试集表现都不好
  • 原因:模型过于简单
  • 调整:增加特征(组合、泛化、相关性)、增加多项式特征项(二次、三次项),提高模型复杂度

6.1.1 模拟欠拟合

# 模拟欠拟合 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split # 1. 创造数据 np.random.seed(66) x = np.random.uniform(-3,3,size=100) y = 0.5*x**2 + x + 2 + np.random.normal(0,1,size=100) # 2. 数据预处理 X = x.shape(-1,1) # 3. 模型训练 estimator = LinearRegression() estimator.fit(X,y) # 4. 模型预测 y_pre = estimator.predict(X) # 5. 模型评估 mse = mean_squared_error(y, y_pre) print(f"均方误差:{mse}") # 6. 画图 plt.scatter(x,y) plt.plot(x,y_pre,color='red') plt.show()

6.2 过拟合

  • 模型在训练集表现好,测试集表现不好
  • 原因:模型过于复杂,存在过多噪声
  • 调整:重新清洗数据;减少特征;增加数据量;L1、L2正则化
    • 正则化:模型训练时,数据中有些特征影响模型复杂度、或某个特征的异常值较多,所以尽量要较少这个特征的影响(甚至删除这个特征)
    • 在损失函数中增加正则化项,可以消除异常点带来的权重值w过大/过小

6.2.1 L1正则化

其中,为惩罚系数,该值越大对的惩罚力度就越大,该特征对整体的影响就越小。

  • L1正则化会使权重趋向于0(可以等于0,一般会将高次方项系数变为0),使得某些特征失效,达到特征筛选的目的。
  • L1正则化的线性回归模型是Lasso 回归

from sklearn.linear_model import Lasso estimator = Lasso(alpha=0.01)

6.2.2 L2正则化

其中,为惩罚系数,该值越大对的惩罚力度就越大,该特征对整体的影响就越小。

  • L2正则化会使权重趋向于0(一般不等于0,对高次方项系数影响较大),使得某些特征影响程度小,达到特征筛选的目的。
  • L2正则化的线性回归模型是岭回归
  • 实际工作中,一般选择L2正则化
from sklearn.linear_model import Ridge estimator = Ridge(alpha=0.01)

6.2.3 模拟过拟合

# 模拟过拟合 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split # 1. 创造数据 np.random.seed(66) x = np.random.uniform(-3,3,size=100) y = 0.5*x**2 + x + 2 + np.random.normal(0,1,size=100) # 2. 数据预处理 X = x.shape(-1,1) X2 = np.hstack([X, X**2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10]) # 3. 模型训练(下面estimator三选一) estimator = LinearRegression() # 正规方程法 estimator = Lasso(alpha=0.01) # L1正则化 estimator = Ridge(alpha=0.01) # L2正则化 estimator.fit(X2,y) # 4. 模型预测 y_pre = estimator.predict(X3) # 5. 模型评估 mse = mean_squared_error(y, y_pre) print(f"均方误差:{mse}") # 6. 画图 plt.scatter(x,y) plt.plot(np.sort(x),y_pre[np.argsort(x)],color='r') # x,y数据要排序 plt.show()

案例汇总

波士顿房价预测


补充知识

A 标量、向量、矩阵、张量

  • 标量scalar:一个独立存在的数,只有大小,没有方向
  • 向量vector:一列顺序排列的元素,有大小有方向,默认是列向量
    • 张三的数理化成绩:
  • 矩阵matrix:二维数组,pd.DataFrame
    • 张三、李四的数理化成绩:
  • 张量Tensor:高维数组,Numpy ndarray,基于向量和矩阵的推广
    • 2个3*4矩阵or3个2*4矩阵or4个2*3矩阵

A1 向量运算

  • 向量的大小:向量的模。如向量(1,2,3),模长=
  • 向量转置:

  • 向量的基运算:

A2 范数Norm

是一个数学概念,具有长度的意义

对于向量

  • L1范数:向量中各个元素绝对值之和

  • L2范数:向量的模,各个元素平方和开平方

  • Lp范数:向量中每个元素p幂求和开p次根

A3 矩阵

  • 矩阵转置
    • ,k为1个常数

  • 矩阵加法:对应元素相加
  • 矩阵乘法:A列数=B行数才能相乘,即这样才能相乘,相乘后为矩阵。
    • 不满足交换律
    • 满足结合率
    • 矩阵与单位阵相乘等于它本身
    • ,则B为A的逆矩阵,记为

如:

  • 方阵:行数=列数,为方阵
    • 对称方阵:
  • 单位阵:方阵,对角线为1,其余为0

B 导数

B1 导数概念

函数某一个点求切线就是导数。(瞬时速度变化率)

导数=0的位置是函数的极值点

偏导:如函数的偏导记为,将视为常数,对求导数。各分量上求偏导,形成一个向量,即为z的导数。

B2 导数公式

B3 导数四则运算

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 9:17:43

Linux操作系统-shell编程之认识shell脚本

Linux Shell 编程实战&#xff1a;让自动化替你“搬砖” 引言 如果你是一个运维工程师&#xff0c;每天可能要重复执行几十次同样的命令——登录服务器、查日志、清缓存、重启服务……这些重复劳动不仅枯燥&#xff0c;而且容易出错。 如果你是一个开发人员&#xff0c;每次部署…

作者头像 李华
网站建设 2026/7/26 9:15:15

C++模板元编程:从SFINAE到Concepts的编译期条件编程实战

1. 项目概述&#xff1a;当C模板遇上“编译时侦探”如果你写过一段时间的C模板代码&#xff0c;尤其是尝试过写一些通用的库函数或者容器&#xff0c;大概率会遇到一种让人挠头的编译错误&#xff1a;编译器告诉你某个类型没有某个成员函数&#xff0c;或者两个类型无法进行某种…

作者头像 李华
网站建设 2026/7/26 9:12:15

AI情感调谐系统:多模态识别与动态策略生成

1. 项目概述&#xff1a;当AI遇见情感疗愈去年冬天&#xff0c;我接待了一位特殊的来访者——某互联网大厂的中层管理者张女士。在第三次咨询时&#xff0c;她突然崩溃大哭&#xff1a;"医生&#xff0c;我每天给团队做心理疏导&#xff0c;却没人知道我自己已经三个月没睡…

作者头像 李华
网站建设 2026/7/26 9:10:04

视频硬字幕提取终极指南:三步解放被“锁死“的视频内容

视频硬字幕提取终极指南&#xff1a;三步解放被"锁死"的视频内容 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测…

作者头像 李华
网站建设 2026/7/26 9:08:04

Linux命令行JSON处理神器jq详解与应用

1. 为什么每个Linux用户都应该掌握jq在终端处理JSON数据就像试图用剪刀裁切钢板——原始工具完全不对口。我第一次面对数百行的JSON响应时&#xff0c;用grep和awk折腾了整整下午&#xff0c;直到发现jq这个"JSON瑞士军刀"。这个轻量级的命令行处理器不仅能漂亮地格式…

作者头像 李华
网站建设 2026/7/26 9:07:48

Ralph模式:AI编程的自动化迭代革命

1. Ralph现象&#xff1a;当AI编程遇上"放羊哲学"2025年5月&#xff0c;一个名为Ralph的AI编程方法在技术圈掀起了一场静默革命。这个由澳洲前软件工程师、现职业牧羊人Geoffrey Huntley创造的方案&#xff0c;用最简单的技术逻辑颠覆了传统软件开发流程。它的核心思…

作者头像 李华