机器学习之线性回归

主要参考:

机器学习| 算法笔记-线性回归(Linear Regression) - 知乎 (zhihu.com)

2-2 线性回归_哔哩哔哩_bilibili

Python机器学习实战:线性回归模型预测波士顿房价_哔哩哔哩_bilibili

回归分析

在数学和统计学中,回归(Regression) 是一种用于分析变量之间关系的方法,核心目标是通过一个或多个自变量(解释变量) 来预测因变量(响应变量) 的连续数值。它不仅是机器学习中的基础任务(如前文所述),更是统计学的重要分支,其数学本质和应用逻辑可从以下维度深入解析:

数学上的回归是一种通过数据拟合函数关系来预测连续值的方法论,其核心在于用统计或机器学习手段建立自变量到因变量的映射,并通过误差最小化确保模型有效性。从简单的线性回归到复杂的非线性模型,回归分析始终是理解变量关系、解决预测问题的基础工具,其思想贯穿统计学、机器学习及各应用学科。

回归的分类

我们这里主要关注线性回归

线性回归

如果在回归分析中,自变量与因变量是线性关系(一次方),那么这种回归分析,我们称之为线性回归。

比如住宅面积和房价的关系:

线性回归通常仅用于连续型数值预测,比如预测房价(面积与价格呈直线关系)

显然,如果投资150万,远远大于预测出来的房价,那么就不值得投资。

线性回归优缺点

  • 优点:简单、计算高效、可解释性强。

  • 缺点:对非线性关系效果差、易受异常值和多重共线性影响。

线性回归是机器学习和统计建模的基础工具,适合初步探索变量关系,但通常需结合数据特性选择合适的变体或更复杂模型。

线性回归分析的目标

还是以房价问题为例

这里,我们是想找到房屋面积和房价之间的线性关系,其中,房屋面积就是一个特征,我们现在要找到这个特征跟房价之间的关系,也就是要寻找到合理的a和b,使得预测结果是相对准确的,因为不同的a和b对结果的影响肯定是不一样的。

那么,怎么就能找到最适合的a和b呢?

如果我们已经知道一些现有的数据,也就是知道一些面积和房价之间的确切对应关系,之后,对于某个模型,使得模型的输出结果和实际值之间的差距最小,也就能确定对应的a和b的值了。

由此,我们引出损失函数这一概念

所谓的损失函数,就是模型输出结果和实际结果之间的差距的函数,当差距最小时,也就是损失函数值最小时,我们的目标就达到了。

所以,上面说的线性回归的目标是什么呢?

答案是:不断迭代数据特征的系数,然后找到损失函数的极小值,从而确定对应的特征系数。

举例说明:

下面有两组假设的拟合所预测出来的结果,我们看看对应的损失函数值各是多少

J1小于J2,看起来J1更合适。

上面只是假设已经有了系数,然后求解下损失函数,但是这个损失函数并不一定就是最小的,那么,我们实际中如何求解呢?

我们先了解两种基础的方法:最小二乘法梯度下降法,其他更多方法以后有需要再学习。

最小二乘法

最小二乘法(Least Squares Method)是一种经典的数学优化方法,主要用于线性回归问题,通过最小化预测值与真实值之间的残差平方和来求解模型参数。它是统计学和机器学习中最基础的参数估计方法之一。

应用场景

  1. 线性回归(房价预测、销量分析等)。

  2. 曲线拟合(如多项式回归)。

  3. 信号处理(滤波器设计)。

  4. 经济学(计量模型参数估计)。

总结

  • 最小二乘法是线性回归的经典解法,适用于小规模数据且特征数较少的情况。

  • 解析解高效但受限于矩阵求逆,大数据时改用梯度下降或随机梯度下降。

  • 改进方法(如岭回归、Lasso)可以解决过拟合和不可逆问题。

  • 非线性问题需使用更复杂的优化方法(如Levenberg-Marquardt)。

最终选择

  • 数据量小且特征少 → 最小二乘法(解析解)

  • 数据量大或特征多 → 梯度下降/SGD

  • 需要特征选择 → Lasso 回归

  • 非线性回归 → 非线性最小二乘法

梯度下降法

上面提到,最小二乘法是线性回归的经典解法,适用于小规模数据且特征数较少的情况,解析解高效但受限于矩阵求逆,大数据时改用梯度下降或随机梯度下降

梯度下降法(Gradient Descent,GD)是一种迭代优化算法,用于寻找可微函数的局部最小值(或最大值)。它是机器学习和深度学习的核心优化方法之一,尤其适用于大规模数据和高维参数空间的优化问题。

示意如下:

对于y=ax+b

总结

  • 梯度下降法是机器学习和深度学习的核心优化算法,通过迭代更新参数最小化损失函数。

  • 主要变体:BGD(稳定但慢)、SGD(快但震荡)、Mini-batch GD(平衡)。

  • 改进算法:Momentum、Adam等可加速收敛并提高稳定性。

  • 适用场景

    • 大规模数据 → Mini-batch GD 或 Adam。

    • 非凸优化(如神经网络)→ Adam/RMSprop。

    • 线性模型 → 可对比最小二乘法(小数据时更高效)。

关键建议

  1. 数据标准化(加速收敛)。

  2. 调试学习率(可从0.01开始尝试)。

  3. 监控损失曲线(判断是否收敛或震荡)。

使用sklearn求解线性回归过程

 我们举个简单的例子看看步骤

那么,我们如何进一步确定拟合出来的效果好不好呢?

代码示例如下:

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score# 1. 直接在程序中定义上面示例的10组数据,我们假设X是房屋面积,y是房价
# 格式:X和y的顺序一一对应
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
y = np.array([7, 9, 11, 13, 15, 17, 19, 21, 23, 25])# 2. 创建线性回归模型并训练
model = LinearRegression()
model.fit(X, y)  # 传入特征和目标变量进行训练# 3. 模型预测(使用训练数据进行预测,查看拟合效果)
y_pred = model.predict(X)# 4. 计算评估指标
mse = mean_squared_error(y, y_pred)  # 均方误差
r2 = r2_score(y, y_pred)  # R²决定系数(越接近1越好)# 5. 输出模型结果
print("=== 线性回归模型结果 ===")
print(f"回归方程:房价 = {model.coef_[0]:.4f} × 房间面积 + {model.intercept_:.4f}")
print(f"均方误差(MSE):{mse:.4f}")
print(f"R²决定系数:{r2:.4f}")# 6. 示例:预测新的房间面积对应的房价
new_area = 150  # 假设新房间面积为150平方米
predicted_price = model.predict([[new_area]])[0]
print(f"\n预测面积为{new_area}平方米的房价:{predicted_price:.2f}万元")

结果:

结果跟预期是一致的,可见训练是有效的。

当然,这只是机器学习最最基础的一种场景了,我们后续由浅入深慢慢深入了解。

实战:波士顿房价预测

使用的是波士顿房屋数据

上面的13行是输入数据的特征,最后一行是房屋价格,也就是机器学习中说的标签。

我们开始测试

线性回归模型假设多个影响房价的因素和房价之间是线性关系,属于多元线性回归,我们可以用线性方程来表示:


线性回归模型训练的目的就是找到一组参数使得模型预测的误差最小,这里面用到了损失函数,最小二乘法,正则化等理论,这里不-一证明了,我们直接看模型训练和预测的效果。

注意:因为波士顿房价数据下架了,所以用加州房价来替代,差不多的。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score# 加载加州房价数据集
california = fetch_california_housing()
X = california.data  # 特征数据
y = california.target  # 目标数据(房价中位数)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建线性回归模型
model = LinearRegression()# 训练模型
model.fit(X_train, y_train)# 在测试集上进行预测
y_pred = model.predict(X_test)# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)# 输出结果
print("线性回归模型评估结果:")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R² Score: {r2:.4f}")# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--')
plt.xlabel('实际房价 (10万美元)')
plt.ylabel('预测房价 (10万美元)')
plt.title('线性回归模型预测结果')
plt.grid(True)
plt.tight_layout()
plt.savefig('prediction_results.png')# 显示特征系数(重要性)
print("\n特征系数(重要性):")
for i, feature in enumerate(california.feature_names):print(f"{feature}: {model.coef_[i]:.4f}")print("\n模型训练和评估已完成,预测结果图已保存为 prediction_results.png")

结果如下:

更多待补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90011.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90011.shtml

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

相关文章

Boost.Asio学习(2):同步读写

Asio 的 buffer 是什么? boost::asio::buffer(...) 是一个函数模板,用于创建一个通用的 buffer 对象,可传递给 I/O 函数(如 read, write, read_some, write_some 等)。 它返回的是 mutable_buffer 或 const_buffer 的…

Java中如何枚举正则表达式捕获组的名字

在使用正则表达式在匹配文本时&#xff0c;除了可以通过表达式捕获命中的文本串外&#xff0c;还可以对捕获的文本串进行命名。尤其是在解析日志的场景中&#xff0c;经常会被用到。表达式如下&#xff1a; \<(?<pri>\d)\>(?<time>.*) (?<host>\S)…

CentOS 系统高效部署 Dify 全攻略

系列文章目录 CentOS系统高效部署fastGPT全攻略 文章目录 系列文章目录一、前言二、准备工作与系统要求三、安装 Docker 与 Docker Compose四、部署 Dify 核心服务五、数据库与存储配置六、网络与安全优化七、监控与运维八、升级与扩展九、附录与资源关键命令速查表官方文档…

xyctf2025第三届京麒CTF

一.MISC 1.XGCTF 直接ai搜索一遍找到了出题人的博客LamentXU 2024-2025年终总结 - LamentXU - 博客园 知道了原题是ciscn中的 在LamentXU的博客乱逛Patriot CTF 2024 MISC 部分 wp - LamentXU - 博客园 找到了博客网站,让后搜索ciscn扎到了博客 CISCN华东南WEB-Polluted |…

Python爬虫 模拟登录 requests版

前言 网站必须是登录状态才能查看网站信息,是最常见的反爬手段,下面我分享一下request模拟登录状态进行请求 目录 模拟登录的原理 直接复制网站Cookie模拟登录状态 通过登录接口信息破解出Cookie模拟登录状态 模拟登录的原理 网站是使用Cookie和session记录网站的登录状态…

一些改进策略

1.要计算一个神经网络模型的总参数量、可训练参数量以及计算量&#xff08;FLOPs&#xff09;&#xff0c;可以使用以下步骤&#xff1a; ### 计算总参数量和可训练参数量&#xff1a; 1. **逐层计算参数量**&#xff1a; - 对于每一层&#xff0c;确定该层的参数量。这通…

React Native响应式布局实战:告别媒体查询,拥抱跨屏适配新时代

前言:当设计师说"这个页面要适配所有手机和平板…" “什么?React Native不支持CSS媒体查询?那怎么实现响应式布局?”——这是很多刚接触React Native的开发者会遇到的灵魂拷问。 但别慌,没有@media,我们照样能玩转多端适配!想象一下:你的App在iPhone SE的小…

[Java恶补day39] 整理模板·考点六【反转链表】

考点六【反转链表】 【考点总结】 1. 206. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&#xff1a; O ( ) O() O()。 【代码】 92. 【题目】 【核心思路】 【复杂度】 时间复杂度&#xff1a; O ( ) O() O()。 空间复杂度&a…

7,TCP服务器

1,创建一个工程 文件目录:

Modbus_TCP_V5 新功能

odbus TCP 服务器指令 MB_SERVER V5.0 新功能概述 如下图1所示服务器指令 MB_SERVER 从 V5.0 以后增加了三个新功能&#xff0c;分别为&#xff1a; 访问数据块中的数据区域&#xff0c;而不是直接访问 MODBUS 地址过程映像区的读访问限制统计变量 NDR_immediate 和 DR_immed…

2-RuoYi-UI管理平台的启动

RuoYi-UI是RuoYi后端框架的管理中心(基于 Vue.js 的前端项目)的详细配置与启动指南,结合官方文档和常见实践整理,涵盖环境准备、配置修改、启动流程及问题排查。 ⚙️ 一、环境准备 Node.js 版本要求:≥12.0(推荐 ≥14.0 或 18.18+ 适配 Vue3) 安装后验证: node -v …

WPF学习笔记(21)ListBox、ListView与控件模板

ListBox与控件模板 一、 ListBox默认控件模板详解二、ItemsPresenter集合数据呈现1. 概述2. 示例 三、 ListView默认控件模板详解1. 概述2. 示例 一、 ListBox默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控…

操作系统【2】【内存管理】【虚拟内存】【参考小林code】

本文完全参考 虚拟内存内存分段内存分页段页式内存管理Linux内存管理 一、虚拟内存 1. 单片机的绝对物理地址 以单片机作为引子&#xff0c;它没有操作系统&#xff0c;每次写完程序是借助工具将程序烧录进单片机&#xff0c;程序才能运行。 单片机由于没有操作系统&#…

【王树森推荐系统】召回05:矩阵补充、最近邻查找

概述 这节课和后面几节课将详细讲述向量召回&#xff0c;矩阵补充是向量召回最简单的一种方法&#xff0c;不过现在已经不太常用这种方法了本节课的矩阵补充是为了帮助理解下节课的双塔模型上节课介绍了embedding&#xff0c;它可以把用户ID和物品ID映射成向量 矩阵补充 模型…

C# 事件(订阅事件和触发事件)

订阅事件 订阅者向事件添加事件处理程序。对于一个要添加到事件的事件处理程序来说&#xff0c;它必须具有 与事件的委托相同的返回类型和签名。 使用运算符来为事件添加事件处理程序&#xff0c;如下面的代码所示。事件处理程序位于该运 算符的右边。事件处理程序的规范可以…

64页精品PPT | 基于DeepSeek的数据治理方案AI大数据治理解决方案数据治理大模型解决方案

这份PPT文档是关于基于DeepSeek的大模型技术在数据治理方案中的应用介绍。强调数据作为新型生产要素与人工智能技术相结合的重要性&#xff0c;指出大模型凭借强大的文学理解、生成能力以及多模态数据处理能力&#xff0c;能为数据治理带来新机遇。文档详细阐述了数据资产化的路…

【文献笔记】Tree of Thoughts: Deliberate Problem Solving with Large Language Models

Tree of Thoughts: Deliberate Problem Solving with Large Language Models https://github.com/princeton-nlp/tree-of-thought-llm 标题翻译&#xff1a;思维树&#xff1a;利用大型语言模型问题求解 1. 内容介绍 1.1. 背景 决策过程有两种模式&#xff1a; 快速、自动…

使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】

从零开始实现数学题目的作答小游戏 开源技术栏 使用 Mathematical_Expression 让计算机做出题人&#xff0c;让代码与数学碰撞出趣味火花。 目录 文章目录 从零开始实现数学题目的作答小游戏目录 从零开始实现数学题目的作答小游戏&#xff1a;让代码与数学碰撞出趣味火花为…

DQL-9-小结

DQL-9-小结 小结DQL语句 小结 DQL语句 SELECT 字段列表 -- 字段名 [AS] 别名FROM 表名列表WHERE条件列表 -- >、 >、 <、 <、 、 <>、 like、 between ... and、 in、 and、 or, 分组之前过滤 GROUP BY分组字段列表HAVING分组后条件列表 -- 分组之后…

[netty5: WebSocketServerHandshaker WebSocketServerHandshakerFactory]-源码分析

在阅读这篇文章前&#xff0c;推荐先阅读以下内容&#xff1a; [netty5: WebSocketFrame]-源码分析[netty5: WebSocketFrameEncoder & WebSocketFrameDecoder]-源码解析 WebSocketServerHandshakerFactory WebSocketServerHandshakerFactory 用于根据客户端请求中的 Web…