当前位置: 首页 > news >正文

线性回归是机器学习中最基础的算法之一,用于建立输入变量(特征)与输出变量

线性回归原理与代码实现

线性回归是机器学习中最基础的算法之一,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。以下是其核心原理及Python实现。

数学原理

线性回归模型表示为:
$y = wX + b$
其中:

  • $y$ 是预测值
  • $X$ 是输入特征矩阵
  • $w$ 是权重(斜率)
  • $b$ 是偏置项(截距)

目标是最小化损失函数(均方误差):
$L = \frac{1}{N}\sum_{i=1}^N (y_i - (wX_i + b))^2$

代码实现
import numpy as np class LinearRegression: def __init__(self): self.w = None # 权重 self.b = None # 偏置 def fit(self, X, y, learning_rate=0.01, epochs=1000): # 初始化参数 n_samples, n_features = X.shape self.w = np.zeros(n_features) self.b = 0 # 梯度下降 for _ in range(epochs): y_pred = np.dot(X, self.w) + self.b # 计算梯度 dw = (1/n_samples) * np.dot(X.T, (y_pred - y)) db = (1/n_samples) * np.sum(y_pred - y) # 更新参数 self.w -= learning_rate * dw self.b -= learning_rate * db def predict(self, X): return np.dot(X, self.w) + self.b
使用示例
# 生成示例数据 X = np.array([[1], [2], [3], [4]]) y = np.array([2, 4, 6, 8]) # 训练模型 model = LinearRegression() model.fit(X, y) # 预测 print(model.predict(np.array([[5]]))) # 输出接近10
关键点说明
  • 梯度下降:通过迭代调整参数使损失函数最小化
  • 学习率:控制参数更新步长,过大可能无法收敛,过小收敛慢
  • 特征缩放:在实际应用中建议对特征做标准化处理
扩展建议
  • 添加正则化(L1/L2)防止过拟合
  • 实现批量梯度下降/随机梯度下降变体
  • 添加模型评估指标(如R²分数)

这段代码完整实现了线性回归的核心逻辑,包含训练和预测功能,适合初学者理解算法本质。实际应用时可结合Scikit-learn等库进行优化。

公式解析

该公式表示均方误差损失函数(Mean Squared Error, MSE),常用于回归问题的模型训练中,用于衡量模型预测值与真实值之间的差异。

  • 符号说明
    • $N$:样本数量。
    • $y_i$:第 $i$ 个样本的真实值。
    • $X_i$:第 $i$ 个样本的特征向量。
    • $w$:模型权重参数(可能是标量或向量,取决于 $X_i$ 的维度)。
    • $b$:偏置项(截距)。
    • $wX_i + b$:模型的线性预测值。

数学意义

公式计算所有样本的预测误差平方的平均值:

  1. 对每个样本,计算预测值 $wX_i + b$ 与真实值 $y_i$ 的差值。
  2. 对差值取平方,消除正负影响并放大较大误差。
  3. 对所有样本的平方误差求和并除以样本数 $N$,得到平均误差。

代码实现(Python)

import numpy as np def mean_squared_error(y_true, y_pred): """ 计算均方误差损失 :param y_true: 真实值数组,形状 (N,) :param y_pred: 预测值数组,形状 (N,) :return: MSE 标量值 """ return np.mean((y_true - y_pred) ** 2) # 示例用法 y_true = np.array([3, 5, 7]) y_pred = np.array([2.5, 5.1, 7.8]) mse = mean_squared_error(y_true, y_pred) print(f"MSE: {mse:.4f}")


优化目标

在训练中,通过调整 $w$ 和 $b$ 最小化 $L$:

  • 使用梯度下降等优化算法,计算 $L$ 对 $w$ 和 $b$ 的偏导数:
    • $\frac{\partial L}{\partial w} = -\frac{2}{N}\sum_{i=1}^N X_i(y_i - (wX_i + b))$
    • $\frac{\partial L}{\partial b} = -\frac{2}{N}\sum_{i=1}^N (y_i - (wX_i + b))$
  • 迭代更新参数直至收敛。
http://www.jsqmd.com/news/226737/

相关文章:

  • Multisim汉化实战:软件层修改完整指南
  • 基于STM32的下载异常:no stlink detected系统学习
  • 用DFS找出指定长度的简单路径
  • STM32下vTaskDelay实现任务延时的完整指南
  • 动态求解线性方程组:Python实现
  • AD导出Gerber文件时层设置的系统学习
  • Oracle数据库中的CLOB与VARCHAR2的无缝转换
  • 初学hal_uart_transmit时容易忽略的细节解析
  • ST7735电源管理模块详解超详细版
  • 便携设备电源管理:零基础入门电池管理电路搭建
  • Nginx代理到https地址忽略证书验证配置
  • MATLAB实现局部敏感哈希(LSH)学习算法详解
  • STM32CubeMX下载后的第一个LED闪烁项目从零实现
  • 双主模式I2C在工业系统中的应用:完整示例
  • 程序员失业再就业了,喜忧参半
  • 基于STM32CubeMX的工控主板时钟架构全面讲解
  • ITQ算法:学习高效二进制哈希码的迭代量化方法
  • Nacos Spring Cloud配置管理指定file-extension的格式为yaml不生效
  • Nginx反向代理出现502 Bad Gateway问题的解决方案
  • STM32CubeMX初学者指南:零基础快速理解开发流程
  • Nginx三种安装方式
  • Keil5下C程序编译错误排查:深度剖析常见问题
  • Windows 11 26H1 已发布,但并非所有平台都能升级
  • 在Arduino中实现SSD1306动画效果:操作指南
  • nginx-静态资源部署
  • TPM 2.0 到底是啥?微软为啥非得让它成 Windows 11 的“硬门槛”[特殊字符](一篇讲透)
  • 基于keil5编译器5.06下载的开发环境搭建手把手教程
  • USB Serial Controller驱动与RS485模块协同工作实战解析
  • 基于Java+SpringBoot+SSM高校志愿活动管理系统(源码+LW+调试文档+讲解等)/高校志愿服务管理系统/高校志愿者活动平台/大学志愿活动管理软件/高校志愿活动管理平台
  • 51单片机蜂鸣器项目入门:制作简易音乐播放器