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

线性回归原理与代码实现

线性回归是机器学习中最基础的算法之一,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。以下是其核心原理及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.mzph.cn/news/1141478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的下载异常:no stlink detected系统学习

当你的STM32下不了程序:深度解析 no stlink detected 的根源与实战解决 你有没有遇到过这样的场景? 手头的STM32开发板一切看起来都正常,电源灯亮了,接线也没松动。可当你在STM32CubeIDE里点击“Download”时,弹出…

STM32 HAL库配置HID协议的超详细版教程

手把手教你用STM32 HAL库实现USB HID设备:从零到“即插即用”的完整实战你有没有遇到过这样的场景?开发一个调试工具,想通过USB把数据传给电脑,结果客户抱怨:“怎么还要装驱动?”、“Mac上根本没法用&#…

Multisim汉化实战:软件层修改完整指南

Multisim汉化实战:从资源修改到自动化部署的完整技术路径你有没有遇到过这样的场景?打开Multisim准备做电路仿真,刚点开“Place”菜单就卡住了——Ground是接地还是电源?Probe到底该译成“探针”还是“探测器”?对于初…

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

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

STM32下vTaskDelay实现任务延时的完整指南

如何在 STM32 上用vTaskDelay实现高效任务延时?FreeRTOS 多任务调度的底层逻辑全解析你有没有遇到过这样的场景:在一个 STM32 项目中,既要读取传感器数据,又要刷新显示屏、处理串口通信,结果发现主循环卡顿严重&#x…

动态求解线性方程组:Python实现

在编程世界中,线性方程组的求解是非常常见的问题。尤其是当这些方程组包含未知变量时,如何编写一个灵活的程序来适应不同的变量数量和方程数量成为了一个挑战。今天我们将探讨如何使用Python来动态处理这种情况,并给出整数解。 问题背景 假设我们有如下一组线性方程: sy…

从STM32视角看CANFD和CAN的区别:通俗解释带宽差异

从STM32视角看CAN FD与经典CAN的差异:一场关于带宽、效率和未来的对话 你有没有遇到过这样的场景? 在调试一个基于STM32的电池管理系统时,主控MCU需要从多个从节点读取电压、温度和SOC数据。每帧只有8字节的经典CAN协议,逼得你不…

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

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

AD导出Gerber文件时层设置的系统学习

Altium Designer导出Gerber文件:从层设置到生产交付的实战指南在电子硬件开发中,完成PCB布局布线只是走完了“万里长征第一步”。真正决定产品能否顺利投产的关键一步——把设计准确无误地交给工厂制造,往往被许多工程师轻视甚至忽视。而这个…

初学hal_uart_transmit时容易忽略的细节解析

初学HAL_UART_Transmit时踩过的坑,你中了几个?在嵌入式开发的日常里,UART 几乎是每个工程师最早接触、也最“习以为常”的外设之一。点亮第一个 LED 后,紧接着往往就是通过串口打印一句 “Hello World”。而使用 STM32 HAL 库的项…

ST7735电源管理模块详解超详细版

ST7735电源管理深度实战:如何让TFT屏功耗从30mA降到2μA?你有没有遇到过这样的情况?项目快收尾了,测试电池续航时却发现——明明MCU已经进入Deep Sleep,电流也压到了几微安,可整机待机电流还是下不去。一查…

便携设备电源管理:零基础入门电池管理电路搭建

从零搭建便携设备电池管理系统:工程师实战入门指南你有没有遇到过这样的情况?辛辛苦苦做好的智能手环原型,充满电只能撑半天;或者蓝牙音箱一插上USB就开始发热,甚至充电到一半自动断开。问题很可能不在主控芯片&#x…

Nginx代理到https地址忽略证书验证配置

Nginx代理到https地址忽略证书验证配置,不推荐在生产环境中使用 在配置中增加: proxy_ssl_server_name on;proxy_ssl_session_reuse ; Nginx在与后端服务器建立SSL/TLS连接时,将使用请求头中的Host字段值作为SNI的一部分&#xff…

MATLAB实现局部敏感哈希(LSH)学习算法详解

局部敏感哈希(LSH)学习算法在MATLAB中的实现与解析 局部敏感哈希(Locality-Sensitive Hashing,简称LSH)是一种经典的无监督哈希方法,广泛应用于大规模近似最近邻搜索任务。其核心优势在于实现极其简单、无需复杂优化,却能提供理论上的碰撞概率保证:原始空间中距离较近…

双主模式I2C在工业系统中的应用:完整示例

双主模式IC如何让工业系统“永不掉线”?一个PLC冗余设计的实战解析你有没有遇到过这样的场景:某条产线突然停机,排查半天才发现是主控MCU通信异常,而整个系统的IC总线也因此陷入瘫痪——所有传感器失联、执行器失控。问题根源往往…

STM32CubeMX下载后的第一个LED闪烁项目从零实现

从零开始点亮第一盏LED:STM32CubeMX实战入门全记录 你有没有过这样的经历?下载完STM32CubeMX,打开软件却不知道下一步该点哪里;好不容易生成了代码,编译烧录后LED却不亮……别担心,这几乎是每个嵌入式新手…

程序员失业再就业了,喜忧参半

这是小红书上一位上海的Java程序员失业想转行的分享贴。 Java开发的就业市场正在经历结构性调整,竞争日益激烈 传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业…

ITQ算法:学习高效二进制哈希码的迭代量化方法

在图像检索、近邻搜索等大规模数据场景中,哈希学习(Hashing)是一种非常高效的近似最近邻搜索技术。其中,Iterative Quantization(ITQ)是一种经典的无监督哈希方法,它能在保持数据方差最大化的同时,尽可能减小PCA降维后数据的量化误差,从而得到更高质量的二进制编码。本…

Nacos Spring Cloud配置管理指定file-extension的格式为yaml不生效

启动了 Nacos server 后&#xff0c;您就可以参考以下示例代码&#xff0c;为您的 Spring Cloud 应用启动 Nacos 配置管理服务了。完整示例代码请参考&#xff1a;nacos-spring-cloud-config-example 添加依赖&#xff1a; <dependency><groupId>com.alibaba.cloud…

基于STM32CubeMX的工控主板时钟架构全面讲解

深入理解STM32工控主板的时钟系统&#xff1a;从CubeMX配置到实战调优在工业自动化和嵌入式控制领域&#xff0c;一个稳定、高效、可维护的硬件平台离不开精准的时钟设计。而作为现代工控设备中广泛采用的核心处理器&#xff0c;STM32系列微控制器的性能上限与系统可靠性&#…