机器学习:基于梯度下降算法的线性拟合实现和原理解析

news2024/10/6 14:28:40

机器学习:基于梯度下降算法的线性拟合实现和原理解析

  • 线性拟合
  • 梯度下降
  • 算法步骤
  • 算法实现
  • 数据可视化(动态展示)
  • 应用示例

当我们需要寻找数据中的趋势、模式或关系时,线性拟合和梯度下降是两个强大的工具。这两个概念在统计学、机器学习和数据科学领域都起着关键作用。本篇博客将介绍线性拟合和梯度下降的基本原理,以及它们在实际问题中的应用。

在这里插入图片描述

线性拟合

线性拟合是一种用于找到数据集中线性关系的方法。它的基本原理是,我们可以使用线性方程来描述两个或多个变量之间的关系。这个方程通常采用以下形式:
y = m x + b y=mx+b y=mx+b

在这个方程中, y y y 是因变量, x x x 是自变量, m m m 是斜率, b b b 是截距。线性拟合的目标是找到最佳的斜率和截距,以使线性方程最好地拟合数据。

为了找到最佳拟合线,我们通常使用最小二乘法。这意味着我们将所有数据点到拟合线的距离的平方相加,然后寻找最小化这个总和的斜率和截距。这可以用数学优化方法来实现,其中一个常用的方法就是梯度下降。

梯度下降

梯度下降是一种迭代优化算法,用于寻找函数的最小值。在线性拟合中,我们的目标是最小化误差函数,即数据点到拟合线的距离的平方和。这个误差函数通常表示为 J ( m , b ) J(m, b) J(m,b),其中 m m m 是斜率, b b b 是截距。我们的任务是找到 m m m b b b 的值,使 J ( m , b ) J(m, b) J(m,b) 最小化。

梯度下降的基本思想是从一个随机初始点开始,然后根据误差函数的梯度方向逐步调整参数,直到找到局部最小值。梯度下降的迭代规则如下:

在这里插入图片描述

在这里, α \alpha α 是学习率,它决定了每次迭代中参数更新的步长。较大的学习率可能导致快速收敛,但可能会错过最小值,而较小的学习率可能需要更多的迭代。

算法步骤

线性回归中的梯度下降是一种优化算法,用于寻找最佳拟合线性模型的参数,以最小化预测值与实际观测值之间的均方误差(Mean Squared Error,MSE)。梯度下降的原理可以概括为以下几个步骤:

初始化参数: 首先,为线性回归模型的参数(权重和偏置项)选择初始值。通常,可以随机初始化这些参数。

计算损失函数: 使用当前的参数值,计算出模型的预测值,并计算预测值与实际观测值之间的差异,即损失函数。在线性回归中,常用的损失函数是均方误差(MSE),它表示为:

在这里插入图片描述

其中, m m m 是样本数量, y ( i ) y^{(i)} y(i) 是第 i i i 个观测值, y ^ ( i ) \hat{y}^{(i)} y^(i) 是模型的预测值。

计算梯度: 梯度是损失函数关于参数的偏导数,表示了损失函数在参数空间中的变化方向。梯度下降算法通过计算损失函数关于参数的梯度来确定参数更新的方向。对于线性回归模型,梯度可以表示为:

在这里插入图片描述

其中, J ( θ ) J(\theta) J(θ) 是损失函数, θ \theta θ 是参数向量, X X X 是特征矩阵, y y y 是目标向量。

参数更新: 使用梯度信息,按照下面的规则来更新参数:

θ = θ − α ∇ J ( θ ) θ=θ−α∇J(θ) θ=θαJ(θ)

其中, α \alpha α 是学习率,它控制着每次参数更新的步长。学习率越小,参数更新越小,但收敛可能会更稳定。学习率越大,参数更新越快,但可能会导致不稳定的收敛或发散。

重复迭代: 重复执行步骤2至步骤4,直到满足停止条件,例如达到最大迭代次数或损失函数收敛到一个足够小的值。在每次迭代中,参数都会根据梯度信息进行更新,逐渐优化以减小损失函数。

梯度下降的目标是找到损失函数的最小值,这将使线性回归模型的预测值与实际观测值之间的误差最小化。通过不断调整参数,梯度下降可以使模型逐渐收敛到最佳参数值,从而得到最佳拟合线性模型。

算法实现

import numpy as np
import matplotlib.pyplot as plt
# 设置字体为支持汉字的字体(例如宋体)
plt.rcParams['font.sans-serif'] = ['SimSun']
# 创建示例数据
X = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# 添加偏置项(截距项)到特征矩阵
# 添加了偏置项(截距项)到特征矩阵 X。这是通过在 X 前面添加一列全为1的列来实现的。这是线性回归模型中的常见步骤。
X_b = np.c_[np.ones((len(X), 1)), X.reshape(-1, 1)]

# 使用正规方程计算最佳参数
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

# 使用梯度下降计算最佳参数
def gradient_descent(X_b, y, theta, learning_rate, num_epochs):
    m = len(y)
    losses = []
    for epoch in range(num_epochs):
        # 计算当前参数下的预测值。
        predictions = X_b.dot(theta)
        error = predictions - y
       # 计算均方误差(MSE)作为损失函数,衡量预测值和实际值之间的差异。
        loss = np.mean(error**2)
        # 计算损失函数的梯度,用于更新参数。
        # X_b.T 表示矩阵 X_b 的转置。在线性代数中,矩阵的转置是指将矩阵的行和列交换,即将矩阵的列向量变成行向量,反之亦然。
        gradient = 2 * X_b.T.dot(error) / m
        theta -= learning_rate * gradient
        losses.append(loss)
    return theta, losses

theta = np.random.randn(2)
learning_rate = 0.01
num_epochs = 1000
theta, losses = gradient_descent(X_b, y, theta, learning_rate, num_epochs)

# 可视化数据和拟合结果
plt.scatter(X, y, label='数据点')
plt.plot(X, X_b.dot(theta_best), label='正规方程拟合', color='green')
plt.plot(X, X_b.dot(theta), label='梯度下降拟合', color='red')
plt.xlabel('特征值')
plt.ylabel('目标值')
plt.legend()
plt.show()

数据可视化(动态展示)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation



# 创建一些示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.rand(100, 1)

# 初始化线性模型参数
theta = np.random.randn(2, 1)


def gradient_descent(X, y, theta, learning_rate, num_iterations):
    m = len(y)
    history = []

    for iteration in range(num_iterations):
        gradients = -2/m * X.T.dot(y - X.dot(theta))
        theta -= learning_rate * gradients
        history.append(theta.copy())

    return history




learning_rate = 0.1
num_iterations = 50

# 添加偏置项
X_b = np.c_[np.ones((100, 1)), X]

# 执行梯度下降算法并获取参数历史
parameter_history = gradient_descent(X_b, y, theta, learning_rate, num_iterations)

# 创建动态可视化
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)

def animate(i):
    y_pred = X_b.dot(parameter_history[i])
    line.set_data(X, y_pred)
    return line,

ani = FuncAnimation(fig, animate, frames=num_iterations, interval=200)
plt.scatter(X, y)
plt.xlabel('X')
plt.ylabel('y')
plt.title('Linear Regression with Gradient Descent')

plt.show()

应用示例

线性拟合和梯度下降在各种领域都有广泛的应用。以下是一些示例:

股市预测:通过线性拟合历史股票价格数据,可以尝试预测未来股价的趋势。

房价预测:使用线性拟合来估算房屋价格与特征(如面积、位置等)之间的关系,帮助买家和卖家做出决策。

机器学习模型训练:梯度下降是训练线性回归、逻辑回归和神经网络等机器学习模型的关键步骤。

自然语言处理:在自然语言处理中,线性拟合可以用于情感分析和文本分类任务。

总之,线性拟合和梯度下降是数据科学和机器学习领域的基本工具,它们帮助我们理解数据中的关系,并训练模型以做出预测和决策。这两个概念的理解对于处理各种数据分析和机器学习问题都至关重要。希望本博客能够帮助你更好地理解它们的基本原理和应用。

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

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

相关文章

SQLI-labs-第五关

知识点:布尔盲注 思路: 1、判断注入点 首先,我们看看正常的回显内容 ?id1 接着输入?id1 ,结果出现语句错误 这里说明存在单引号的闭合错误 ?id1 and 11-- ?id1 and 12-- 这里没有任何回显信息,可以准确的确…

基于STM32程序万年历液晶1602显示-proteus仿真-源程序

一、系统方案 本设计采用STM32单片机作为主控器,液晶1602显示,按键设置万年历。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 //通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr&…

官方YOLOV5的torch模型->ONNX模型->RKNN模型

1、环境配置 1.1 RKNN Toolkit2的环境配置 下载RKNN Toolkit2 git clone https://github.com/rockchip-linux/rknn-toolkit2.git打开一个终端命令行窗口,安装 Python3.6 和 pip3 sudo apt-get install python3 python3-dev python3-pip安装所需的依赖包 sudo apt-get inst…

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾:线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法:坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇(十二):用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

Unity中Shader的变体shader_feature

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性,用于配合shader_feature来控制…

解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

deepspeed存在一个bug,即在训练时不保存调度器状态,因此如果训练中断后再重新开始训练,调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出:https://github.com/mic…

清理Maven仓库中下载失败的文件

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

【SpringBoot】统一功能处理

目录 🎃1 拦截器 🎀1.1 拦截器的代码实现 🎨1.2 拦截器的实现原理 🧶2 拦截器应用——登录验证 🦺3 异常统一处理 🎭4 统一数据返回格式 🧤4.1 为什么需要统一数据返回格式 🧣4.2 统…

Cisco Packet Tracer入门篇

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Python中的文件I/O操作:常见问题与解决方案

在Python编程中,文件I/O操作是常见的任务。本文将介绍一些关于Python文件I/O操作的常见问题及其解决方案,并提供详细的代码示例。 1、问题:如何正确地打开和关闭文件? 解决方案:使用with语句可以确保文件在操作完成后…

查漏补缺 - ES6

目录 1,let 和 const1,会产生块级作用域。2,如何理解 const 定义的变量不可被修改? 2,数组3,对象1,Object.is()2,属性描述符3,常用API4,得到除某个属性之外的新对象。 4…

华为云云服务器评测|使用Docker可视化Portainer部署Yolov5项目进行AI识别

目录 初始化配置使用Xshell连接 项目准备 docker-compose Dockerfile .dockerignore 在服务器中启动Docker项目 初始化配置使用Xshell连接 因为我比较喜欢用xshell来操作服务器,如果你是使用华为在线的CloudShell或其他方式,可以跳过第一步的连接…

【Redis专题】Redis持久化、主从与哨兵架构详解

目录 前言课程目录一、Redis持久化1.1 RDB快照(Snapshot):二进制文件基本介绍开启/关闭方式触发方式bgsave的写时复制(COW,Copy On Write)机制优缺点 1.2 AOF(append-only file)&…

Git—版本控制系统

git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱(用户标识,必…

数学建模--逻辑回归算法的Python实现

首先感谢CSDN上发布吴恩达的机器学习逻辑回归算法任务的各位大佬. 通过大佬的讲解和代码才勉强学会. 这篇文章也就是简单记录一下过程和代码. CSDN上写有关这类文章的大佬有很多,大家都可以多看一看学习学习. 机器学习方面主要还是过程和方法. 这篇文章只完成了线性可分方面的任…

Mac Homebrew中常用的 Brew 命令

Mac 中常用的 Brew 命令集 Brew(Homebrew)是一个强大的包管理器,用于在 macOS 上安装、更新和管理各种软件包。它使得在 Mac 上安装开发工具、应用程序和库变得轻松和便捷。本博客将介绍一些在 Mac 中常用的 Brew 命令,以帮助您更…

SpringMVC_SSM整合

一、回顾SpringMVC访问接口流程 1.容器加载分析 容器分析 手动注册WebApplicationContext public class ServletConfig extends AbstractDispatcherServletInitializer {Overrideprotected WebApplicationContext createServletApplicationContext() {//获取SpringMVC容器An…

UDP的可靠性传输

UDP系列文章目录 第一章 UDP的可靠性传输-理论篇(一) 第二章 UDP的可靠性传输-理论篇(二) 文章目录 UDP系列文章目录前言1.TCP 和UDP格式对比2.UDP分片原理3.UDP 传输层应该注意问题4.MTU5.UDP 分片机制设计重点 一、ARQ协议什么…

华为OD机考算法题:食堂供餐

目录 题目部分 解析与思路 代码实现 题目部分 题目食堂供餐题目说明某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。…