基于梯度下降的多元线性回归原理

news2025/7/18 23:48:16

为了展示多元线性回归的迭代过程,我们可以使用梯度下降算法手动实现多元线性回归。梯度下降是一种迭代优化算法,用于最小化损失函数。

我们将以下步骤进行手动实现:

  1. 初始化回归系数。
  2. 计算预测值和损失函数。
  3. 计算梯度。
  4. 更新回归系数。
  5. 重复步骤2-4,直到损失函数收敛或达到最大迭代次数。

以下是用Python代码实现梯度下降算法进行多元线性回归的过程:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成样本数据
np.random.seed(0)
X1 = np.random.rand(100) * 10
X2 = np.random.rand(100) * 10
y = 5 + 2 * X1 - 1 * X2 + np.random.randn(100) * 2

# 创建DataFrame
data = pd.DataFrame({'X1': X1, 'X2': X2, 'y': y})

# 特征矩阵和目标变量
X = data[['X1', 'X2']]
X = np.c_[np.ones(X.shape[0]), X]  # 添加一列1表示截距项
y = data['y'].values

# 初始化回归系数
theta = np.random.randn(3)

# 超参数
learning_rate = 0.01
max_iter = 1000
tolerance = 1e-6

# 梯度下降
for i in range(max_iter):
    # 计算预测值
    y_pred = X.dot(theta)
    
    # 计算损失函数(均方误差)
    loss = np.mean((y_pred - y) ** 2)
    
    # 计算梯度
    gradient = 2 * X.T.dot(y_pred - y) / y.size
    
    # 更新回归系数
    new_theta = theta - learning_rate * gradient
    
    # 判断是否收敛
    if np.max(np.abs(new_theta - theta)) < tolerance:
        print(f"在第{i+1}次迭代后收敛")
        break
    
    theta = new_theta

# 输出结果
print(f"回归系数: {theta}")
print(f"损失函数: {loss}")

# 评价模型
y_pred = X.dot(theta)
mse = np.mean((y_pred - y) ** 2)
r2 = 1 - (np.sum((y - y_pred) ** 2) / np.sum((y - np.mean(y)) ** 2))

print(f"均方误差: {mse}")
print(f"R^2 值: {r2}")

# 绘制真实值与预测值的比较
plt.scatter(y, y_pred)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('真实值 vs 预测值')
plt.plot([y.min(), y.max()], [y.min(), y.max()], color='red') # 画一条对角线
plt.show()

在这个代码中,我们手动实现了多元线性回归的梯度下降过程:

  1. 初始化回归系数 theta
  2. 计算预测值 y_pred
  3. 计算损失函数(均方误差)。
  4. 计算梯度。
  5. 根据梯度更新回归系数 theta
  6. 检查收敛条件,达到收敛条件或最大迭代次数时停止迭代。

通过这种方法,我们能够清楚地看到迭代的过程以及每次迭代中回归系数的更新。

让我们详细解释一下梯度的计算公式。

在多元线性回归中,我们的目标是最小化损失函数,通常是均方误差(Mean Squared Error, MSE),它定义为:

在这里插入图片描述

为了最小化这个损失函数,我们使用梯度下降法。梯度下降法的核心是计算损失函数关于回归系数的梯度,然后沿着梯度的负方向更新回归系数。

梯度计算

在这里插入图片描述

这里乘以2是因为我们在计算均方误差时没有将常数1/2包含在内,所以在梯度计算中需要额外乘以2。

更新回归系数

在这里插入图片描述

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

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

相关文章

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中&#xff0c;说到了数据“相关性”的概念&#xff0c;但是在统计学中&#xff0c;不仅存在“相关性”还存在“独立性”等等&#xff0c;所以&#xff0c;本文主要对数据“相关性”进行一些补充。当然&#xff0c;如果这篇文章还能入得了各位“看官…

MPT(merkle Patricia trie )及理解solidity里的storage

what&#xff1f; MPT树是一种数据结构&#xff0c;用于在以太坊区块链中高效地存储和检索账户状态、交易历史和其他重要数据。MPT树的设计旨在结合Merkle树和Patricia树的优点&#xff0c;以提供高效的数据存储和验证 MPT树由四种类型的节点组成&#xff1a; **扩展节点&…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。随着技术的发展&#xff0c;Node.js 不断推出新版本&#xff0c;引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南&#xff0c;帮…

轻量级的数据交换格式JSON (JavaScript Object Notation)介绍

什么是JSON&#xff1f; JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它属于JavaScript的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 JSON具有易读性&…

Ubuntu Server 20.04挂载磁盘

先查看磁盘信息&#xff1a; sudo fdisk -l然后提供NTFS文件系统支持&#xff1a; sudo mkfs.ntfs /dec/sda -F这个过程非常久… 处理完如上图。&#xff08;ps. 这个 Have a nice day. 好浪漫~&#xff09; 接着挂载磁盘&#xff1a; sudo mount /dev/sda ~/device设置开机…

安装golang

官网:All releases - The Go Programming Language (google.cn) 下载对应的版本安装即可

MongoDB——写入耗时

mongodb写入10万条数据的耗时差不多是1s import time import pymongo from pymongo import MongoClient# 连接到MongoDB client MongoClient(mongodb://localhost:27017/) db client[test_db] collection db[test_collection]# 生成10万条数据 documents [{"name&quo…

免费分享:1901-2020全球气候数据集(附下载办法)

长期的全球其后数据不仅能够揭示长期的气候趋势&#xff0c;还为农业、水资源管理、公共卫生等多个领域的决策提供科学依据&#xff0c;对于推动可持续发展具有重要意义。 数据集简介 CRU TS&#xff08;Climatic Research Unit gridded Time Series&#xff09;数据集&#…

【面经总结】Java基础 - SPI

SPI 什么是 SPI&#xff1f; 提供给服务提供者去使用的一个接口 SPI 的优点 低耦合配置灵活多态性 SPI 的应用场景 JDBCSLF4J 日志

GenIcam标准(二)—— GenApi 模块 – 配置相机

系列文章目录 GenICam标准&#xff08;一&#xff09;—— 概述 GenIcam标准&#xff08;二&#xff09;—— GenApi 模块 – 配置相机 文章目录 系列文章目录1、简介2、照相机描述文件的基本结构3、 节点、接口和抽象特征参考 1、简介 GenApi 模块解决如何去配置相机的问题。主…

论文发表CN期刊《高考》是什么级别的刊物?

论文发表CN期刊《高考》是什么级别的刊物&#xff1f; 《高考》是由吉林省长春出版社主管并主办的省级教育类期刊&#xff0c;期刊以科教兴国战略为服务宗旨&#xff0c;专门反映和探索国内外教育教学和科研实践的最新成果。该期刊致力于为广大教育工作者提供一个高质量的学术…

UDP的组播发送与接收C语言测试和nc接收组播测试

组播这个东西&#xff0c;很多年前用过一次。本身的原理不复杂&#xff0c;未知的是使用的环境&#xff0c;受使用环境的影响有多大&#xff0c;还是那句废话&#xff0c;具体问题具体分析。 发送端代码multicast.c #include <stdio.h> #include <stdlib.h> #…

大泽动力TO32000ET-Z 电动30千瓦柴油发电机规格型号参数

大泽动力30KW柴油发电机概述 大泽动力30KW柴油发电机是一种具有稳定输出功率的发电设备&#xff0c;主要用于提供电力支持。其设计结合了国外先进的低噪音发电机和发动机技术&#xff0c;使得机组在运行过程中噪音低&#xff0c;结构紧凑&#xff0c;占用空间小。以下是关于30…

DC/AC电源模块:为电动车充电基础设施提供高效能源转换

BOSHIDA DC/AC电源模块&#xff1a;为电动车充电基础设施提供高效能源转换 DC/AC电源模块是一种用于电动车充电基础设施的重要组件&#xff0c;它能够实现高效能源转换。在电动车的普及和推广过程中&#xff0c;DC/AC电源模块的重要性日益凸显。本文将从DC/AC电源模块的基本原…

Python使用策略模式实现绘图功能

策略模式&#xff08;Strategy Pattern&#xff09;:允许定义一系列算法&#xff0c;将它们封装起来&#xff0c;使得它们可以互换。 实现绘制不同类型的图表&#xff08;如折线图、柱状图和饼图&#xff09;功能。 下面是一个示例&#xff0c;展示如何传入横坐标和纵坐标内容…

探索Lua语言:安装、基本语法与应用案例

Lua Lua语言是在1993年由巴西一个大学研究小组发明的&#xff0c;其设计目标是作为嵌入式程序移植到其他应用程序。它是由C语言实现的&#xff0c;虽然简单小巧但功能强大&#xff0c;所以许多应用都选用它作为脚本语言&#xff0c;尤其是在游戏领域&#xff0c;如暴雪公司的“…

W3F 宣布第二轮 Decentralized Voices 代理者,OneBlock+ 被委托 420 万 DOT 投票权

原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-cohort-2-b10ddb7c71cc 编译&#xff1a;OneBlock Web3 基金会很高兴宣布 Polkadot 和 Kusama 的去中心化声音 (DV) 计划第二批启动&#xff0c;该计划通过将 180,000 KSM 和 4200 万 DOT 的投票权委…

最后一篇不再更新:前端的我转行国外土木了

一.本来早该去写了的&#xff0c;但是一直转行不成功。 你问我为什么要转行&#xff0c;这么说吧&#xff0c;楼主20届专科毕业之后干了一年多土木&#xff0c;相信大家在网络上也刷到过类似的视频。49年入国军。没错&#xff0c;苦逼的楼主不是一个开朗的人&#xff0c;也不是…

【全开源】ChatGPT 机器人公众号小程序h5源码开源交付支持二开

AI机器人系统对接OPENAI&#xff1a;智能互联的无限可能 &#x1f310; 一、引言&#xff1a;AI机器人系统与OPENAI的碰撞 在科技日新月异的今天&#xff0c;AI机器人系统正逐渐渗透到我们生活的各个角落。而当这一智能系统与全球领先的OPENAI技术相结合&#xff0c;又将擦出…

如何在 Go 应用程序中使用检索增强生成(RAG)

本文将帮助大家实现 RAG &#xff08;使用 LangChain 和 PostgreSQL &#xff09;以提高 LLM 输出的准确性和相关性。 得益于强大的机器学习模型&#xff08;特别是由托管平台/服务通过 API 调用公开的大型语言模型&#xff0c;如 Claude 的 LLama 2等&#xff09;&#xff0c…