news 2026/4/5 7:48:59

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

作者头像

张小明

前端开发工程师

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

线性回归原理与代码实现

线性回归是机器学习中最基础的算法之一,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。以下是其核心原理及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))$
  • 迭代更新参数直至收敛。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 5:57:27

用DFS找出指定长度的简单路径

在图论和计算机科学中,寻找图中所有符合条件的路径是常见的问题之一。今天我们将探讨如何使用深度优先搜索(DFS)来找出一个有向图中从给定顶点出发的所有简单路径,这些路径的长度不超过指定的最大长度k。我们将通过一个具体的实例来展示这个过程,并讨论DFS的优势和一些需要…

作者头像 李华
网站建设 2026/4/1 17:31:10

Oracle数据库中的CLOB与VARCHAR2的无缝转换

引言 在数据库设计中,数据类型的选择对系统的性能和可扩展性有着重要的影响。特别是当数据量增大时,存储字段的数据类型选择显得尤为关键。Oracle数据库提供了多种数据类型,其中VARCHAR2和CLOB是常用的字符数据类型。今天我们来探讨一个有趣的现象:当将VARCHAR2(4000)类型…

作者头像 李华
网站建设 2026/4/4 22:25:49

时自动清理过期条目

一、核心原理 1. 数据存储结构 // 每个 Thread 对象内部都有一个 ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals null;// ThreadLocalMap 内部使用 Entry 数组&#xff0c;Entry 继承自 WeakReference<ThreadLocal<?>> static class Entry extends We…

作者头像 李华
网站建设 2026/4/2 2:04:41

基于Python+Django的美容院管理系统设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/4/1 22:19:43

STM32+串口字符型LCD显示方案:系统学习路径

从零开始玩转 STM32 串口字符型LCD&#xff1a;不只是“打印Hello World”你有没有遇到过这样的场景&#xff1f;项目做了一半&#xff0c;突然发现MCU的GPIO快被外设占满了——按键、传感器、通信模块……结果连一个1602 LCD都接不上&#xff0c;因为传统的并行驱动要占用整整…

作者头像 李华
网站建设 2026/3/31 22:24:28

51单片机蜂鸣器项目入门:制作简易音乐播放器

用51单片机“弹”一首《小星星》&#xff1a;从蜂鸣器发声到音乐播放的完整实现你有没有想过&#xff0c;一块几块钱的51单片机&#xff0c;加上一个小小的蜂鸣器&#xff0c;也能“演奏”出旋律&#xff1f;不是单调的“嘀嘀”提示音&#xff0c;而是真正能听出调子的《小星星…

作者头像 李华