线性回归简介:从理论到应用

embedded/2025/2/6 7:30:15/

什么是回归>线性回归

回归>线性回归是一种用于预测数值型结果的统计方法,它通过建立一个或多个自变量(输入特征)与因变量(输出目标)之间的线性关系模型来工作。在最简单的形式中,即简单回归>线性回归,仅涉及一个自变量和一个因变量,而多变量回归>线性回归则考虑了多个自变量。

数学表达

回归>线性回归中,假设自变量 x x x 和因变量 y y y 之间存在线性关系,可以表示为:
y = θ 0 + θ 1 x + ϵ y = \theta_0 + \theta_1 x + \epsilon y=θ0+θ1x+ϵ
其中, θ 0 \theta_0 θ0 是截距项, θ 1 \theta_1 θ1 是斜率参数,描述了 x x x y y y 的影响程度,而 ϵ \epsilon ϵ 表示误差项,代表了未被模型捕捉到的变异性。

损失函数

为了找到最佳拟合直线,我们定义了一个损失函数,通常采用均方误差(Mean Squared Error, MSE)的形式:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
这里, h θ ( x ) h_\theta(x) hθ(x)是模型的预测值, y ( i ) y^{(i)} y(i) 是实际值, m m m 是样本数量。

参数估计

为了最小化损失函数 J ( θ ) J(\theta) J(θ),我们使用梯度下降法或正规方程等方法来更新参数 θ \theta θ。这些方法旨在寻找一组参数值,使得模型对训练数据的预测尽可能准确。

梯度下降法

梯度下降是一种迭代优化算法,它通过沿着损失函数的负梯度方向调整参数来逐步减少损失。更新规则如下:
θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta) θj:=θjαθjJ(θ)
其中, α \alpha α 是学习率,控制每次更新的步长大小。回归>线性回归利用梯度下降法进行参数更新的公式推导如下:

  1. 定义损失函数:首先,定义回归>线性回归的损失函数(通常为均方误差,Mean Squared Error, MSE):
    J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
    其中:
  • h θ ( x ( i ) ) = θ T x ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} hθ(x(i))=θTx(i) 是模型的预测值。
  • y ( i ) y^{(i)} y(i) 是实际值。
  • m m m 是训练样本的数量。
  1. 求导:为了最小化损失函数 J ( θ ) J(\theta) J(θ),我们需要对参数 θ \theta θ 求导,并令导数等于0。具体来说,我们对每个参数 θ j \theta_j θj 偏导数:
    ∂ ∂ θ j J ( θ ) = ∂ ∂ θ j ( 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 ) \frac{\partial}{\partial \theta_j} J(\theta) = \frac{\partial}{\partial \theta_j} \left( \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 \right) θjJ(θ)=θj(2m1i=1m(hθ(x(i))y(i))2)

  2. 计算偏导数:计算上述表达式的偏导数 ∂ ∂ θ j J ( θ ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ ∂ ∂ θ j h θ ( x ( i ) ) \frac{\partial}{\partial \theta_j} J(\theta) = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot \frac{\partial}{\partial \theta_j} h_\theta(x^{(i)}) θjJ(θ)=m1i=1m(hθ(x(i))y(i))θjhθ(x(i))
    由于 h θ ( x ( i ) ) = θ T x ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} hθ(x(i))=θTx(i),所以: ∂ ∂ θ j h θ ( x ( i ) ) = x j ( i ) \frac{\partial}{\partial \theta_j} h_\theta(x^{(i)}) = x_j^{(i)} θjhθ(x(i))=xj(i)
    因此: ∂ ∂ θ j J ( θ ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial}{\partial \theta_j} J(\theta) = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} θjJ(θ)=m1i=1m(hθ(x(i))y(i))xj(i)

  3. 更新规则:为了最小化损失函数,我们沿着负梯度方向更新参数 θ j \theta_j θj
    θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta) θj:=θjαθjJ(θ)
    代入上面的偏导数结果: θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

  4. 最终更新公式

整理得到最终的参数更新公式:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

这就是回归>线性回归中使用梯度下降法进行参数更新的公式。

python">
import numpy as np
def linear_regression_gradient_descent(X: np.ndarray, y: np.ndarray, alpha: float, iterations: int) -> np.ndarray:m, n = X.shapetheta = np.zeros((n, 1))for _ in range(iterations):predictions = X @ thetaerrors = predictions - y.reshape(-1, 1)updates = X.T @ errors / mtheta -= alpha * updatesreturn np.round(theta.flatten(), 4)

正规方程

对于某些问题,可以直接求解最优参数,无需迭代过程。这可以通过解下面的正规方程完成:
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)1XTy
这种方法适用于当特征数量不多且矩阵可逆时的情况。具体推导过程如下:
回归>线性回归参数更新公式的推导如下:

  1. 目标函数:回归>线性回归的目标是找到一组参数 θ \theta θ,使得预测值 h θ ( x ) h_\theta(x) hθ(x) 与实际值 y y y 之间的误差最小。通常使用均方误差(Mean Squared Error, MSE)作为损失函数:
    J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
    其中, h θ ( x ) = θ T x h_\theta(x) = \theta^T x hθ(x)=θTx 是预测值, x ( i ) x^{(i)} x(i) y ( i ) y^{(i)} y(i) 分别是第 i i i 个训练样本的特征向量和目标值。

  2. 损失函数的矩阵形式:将上述公式转换为矩阵形式,设 X X X 是特征矩阵(每一行是一个训练样本,每一列是一个特征), y y y 是目标值向量,则损失函数可以写为:
    J ( θ ) = 1 2 m ( X θ − y ) T ( X θ − y ) J(\theta) = \frac{1}{2m} (X\theta - y)^T (X\theta - y) J(θ)=2m1(y)T(y)

  3. 求导:为了找到使损失函数最小化的 θ \theta θ,需要对 θ \theta θ 导,并令导数等于0。首先计算损失函数关于 θ \theta θ 的导数:
    ∇ θ J ( θ ) = 1 m X T ( X θ − y ) \nabla_\theta J(\theta) = \frac{1}{m} X^T (X\theta - y) θJ(θ)=m1XT(y)

  4. 设置导数为0:令导数等于0,得到:
    1 m X T ( X θ − y ) = 0 \frac{1}{m} X^T (X\theta - y) = 0 m1XT(y)=0
    化简得:
    X T X θ = X T y X^T X \theta = X^T y XT=XTy

  5. 解方程:假设 X T X X^T X XTX 是非奇异的(即可逆),则可以通过两边同时左乘 ( X T X ) − 1 (X^T X)^{-1} (XTX)1 得到:
    θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)1XTy

这就是回归>线性回归中使用正规方程(Normal Equation)来求解参数 θ \theta θ 的过程。

python">import numpy as np
def linear_regression_normal_equation(X: list[list[float]], y: list[float]) -> list[float]:# Your code here, make sure to roundX = np.array(X)y = np.array(y).reshape(-1, 1)X_T = X.Ttheta = np.linalg.inv(X_T @ X) @ X_T @ ytheta = np.round(theta, 4).flatten().tolist()return theta

实际应用

当然回归>线性回归也是可以捕捉到数据中的非线性关系的,只需要在数据中进行预处理即可。比如,当利用变量 ( x 1 , x 2 ) (x_1, x_2) (x1,x2)预测房价 y y y,我们可以手动添加特征 x 1 2 , x 1 x 2 x_1^{2},x_1x_2 x12,x1x2之类经过非线性变换后的变量,这样就可以让回归>线性回归学习到非线性关系了!更细致的回归>线性回归讲解可以参考Google Crash Courese 回归>线性回归


http://www.ppmy.cn/embedded/159965.html

相关文章

如何利用i18n实现国际化

1.首先新建i18.js文件 // i18n配置 import { createI18n } from vue-i18n // import ElementPlus from element-plus import zhCn from element-plus/es/locale/lang/zh-cn import zh from ./zh-cn import en from ./en import ru from ./ru const messages {en_US: {...en,//…

糖果(安师大)

转移方程 转移方程的核心思想是 选择和不选择当前物品 两种情况的比较。具体来说: 不选择当前物品: 如果不选择第 i 个物品,那么 dp(i, j) 就等于 dp(i-1, j),即前 i-1 个物品中,满足 总价值 % k j 的最大和。 选…

【异常记录Java-20250204】调用讯飞星火AI(Spark lite 版本)Api 授权错误问题处理

问题重现 依赖 <!--讯飞开放平台sdk--> <dependency><groupId>io.github.briqt</groupId><artifactId>xunfei-spark4j</artifactId><version>1.3.0</version> </dependency>yml配置文件 # 讯飞Api配置 xunfei:client:ap…

Vue和Java使用AES加密传输

背景&#xff1a;Vue对参数进行加密&#xff0c;对响应进行解密。Java对参数进行解密&#xff0c;对响应进行解密。不拦截文件上传类请求、GET请求。 【1】前端配置 安装crypto npm install crypto-js编写加解密工具类encrypt.js import CryptoJS from crypto-jsconst KEY …

vim-plug的自动安装与基本使用介绍

vim-plug介绍 Vim-plug 是一个轻量级的 Vim 插件管理器&#xff0c;它允许你轻松地管理 Vim 插件的安装、更新和卸载。相较于其他插件管理器&#xff0c;vim-plug 的优点是简单易用&#xff0c;速度较快&#xff0c;而且支持懒加载插件&#xff08;即按需加载&#xff09; 自动…

3.【BUUCTF】XSS-Lab1

进入题目页面如下 好好好&#xff0c;提示点击图片&#xff0c;点进去页面如下&#xff0c;且url中有传参&#xff0c;有注入点 发现题目给出了源码 查看得到本题的源码 分析一下代码 <!DOCTYPE html><!--STATUS OK--> <!-- 声明文档类型为 HTML5&#xff0c;告…

基于 docker 的mysql 5.7 主主集群搭建

创建挂载目录和配置文件 主节点1 mkdir -p /mysql_master_1/mysql/log mkdir -p /mysql_master_1/mysql/data mkdir -p /mysql_master_1/mysql/conf vim /mysql_master_1/mysql/conf/my.cnf[mysqld] datadir/var/lib/mysql #MySQL 数据库文件存放路径 server_id 1 #指定数据…

React组件中的列表渲染与分隔符处理技巧

React组件中的列表渲染与分隔符处理技巧 摘要问题背景解决方案分析方案一&#xff1a;数组拼接法方案二&#xff1a;Fragment组件方案三&#xff1a;动态生成key 关键技术点1. key的使用原则2. Fragment组件3. 性能优化 实战演练挑战1&#xff1a;动态分隔符样式挑战2&#xff…