【机器学习(二)】线性回归之梯度下降法

news2024/9/9 0:28:58

在这里插入图片描述

文章目录

  • 专栏导读
  • 1、梯度下降法原理
  • 2、梯度下降法原理代码实现
  • 3、sklearn内置模块实现

专栏导读

✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。

本文录入于《数据分析之术》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分析工程师精心打造,对机器学习算法知识点逐一击破,不断学习,提升自我。
订阅后,可以阅读《数据分析之术》中全部文章内容,详细介绍数学模型及原理,带领读者通过模型与算法描述实现一个个案例。
还可以订阅基础篇《数据分析之道》,其包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》

1、梯度下降法原理

梯度下降法是一种常见的优化方法,常用于求解损失函数最小化的问题。在线性回归模型中,我们可以使用梯度下降法来求解使得模型损失函数最小的模型参数。
在这里插入图片描述

梯度下降法的基本思想是沿着当前位置梯度的反方向移动一小步,以期望能够到达函数的最小值点。
具体来说,我们假设 f ( θ ) f(\theta) f(θ)表示模型的损失函数,其中 θ \theta θ是模型的参数向量,损失函数的梯度为 ∇ f ( θ ) \nabla f(\theta) f(θ),那么梯度下降法的更新公式可以表示为:

θ = θ − η ∇ f ( θ ) \theta = \theta - \eta \nabla f(\theta) θ=θηf(θ)

其中 η \eta η为学习率,表示更新步长的大小,需要手动指定。梯度下降法的过程中,我们从一个随机的初始参数向量 θ 0 \theta_0 θ0开始,不断迭代,根据上式不断更新参数向量,直到达到最小化损失函数的要求,即:

f ( θ t + 1 ) − f ( θ t ) < ϵ f(\theta_{t+1}) - f(\theta_t) < \epsilon f(θt+1)f(θt)<ϵ

其中 t t t表示迭代次数, ϵ \epsilon ϵ表示收敛的阈值,通常取一个很小的数值,比如 1 0 − 4 10^{-4} 104

在线性回归中,损失函数通常采用平方误差损失函数:

L ( θ ) = 1 2 n ∑ i = 1 n ( h θ ( x ( i ) ) − y ( i ) ) 2 L(\theta) = \frac{1}{2n} \sum_{i=1}^n (h_{\theta}(x^{(i)}) - y^{(i)})^2 L(θ)=2n1i=1n(hθ(x(i))y(i))2

其中 h θ ( x ( i ) ) h_{\theta}(x^{(i)}) hθ(x(i))为模型对第 i i i个样本的预测值, y ( i ) y^{(i)} y(i)为第 i i i个样本的真实值。对该损失函数求梯度,我们得到:

∇ L ( θ ) = 1 n ∑ i = 1 n ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \nabla L(\theta) = \frac{1}{n} \sum_{i=1}^n (h_{\theta}(x^{(i)}) - y^{(i)}) x^{(i)} L(θ)=n1i=1n(hθ(x(i))y(i))x(i)

将该梯度代入梯度下降法的更新公式中,就可以求得线性回归模型的参数向量 θ \theta θ

2、梯度下降法原理代码实现

我们来用Python实现一个线性回归模型,使用梯度下降法来最小化成本函数。

首先,我们需要导入必要的库:

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

然后,我们生成一个模拟数据集。这里我们使用numpy库的random.randn()函数生成100个样本数据,其中的真实关系是y=3x+2,同时为了模拟真实情况,我们在y上加上了一些噪声:

np.random.seed(0)
X = 2 * np.random.randn(100, 1)
y = 6 + 3 * X + np.random.randn(100, 1)

接下来,我们需要定义成本函数和梯度下降函数。成本函数采用均方误差(MSE)的形式:

def compute_cost(X, y, theta):
    m = len(y)
    predictions = X.dot(theta)
    cost = 1/(2*m) * np.sum(np.square(predictions-y))
    return cost

梯度下降函数则需要不断迭代,不断更新theta参数,直到成本函数最小化。迭代次数、学习率等超参数需要手动设置:

def gradient_descent(X, y, theta, learning_rate, iterations):
    m = len(y)
    cost_history = np.zeros(iterations)
    theta_history = np.zeros((iterations, 2))
    for i in range(iterations):
        predictions = X.dot(theta)
        error = predictions - y
        gradient = 1/m * X.T.dot(error)
        theta = theta - learning_rate * gradient
        theta_history[i,:] = theta.T
        cost_history[i] = compute_cost(X, y, theta)
    return theta, cost_history, theta_history

最后,我们需要将生成的数据集进行可视化,并且调用梯度下降函数来训练模型:

# 添加截距列
X_b = np.c_[np.ones((len(X), 1)), X]

# 定义初始theta值和超参数
theta = np.random.randn(2,1)
learning_rate = 0.1
iterations = 1000

# 训练模型
theta, cost_history, theta_history = gradient_descent(X_b, y, theta, learning_rate, iterations)

绘制模型拟合直线和数据点:

plt.scatter(X, y)
plt.plot(X, X_b.dot(theta), 'r')
plt.show()

在这里插入图片描述

绘制成本函数随迭代次数变化的曲线:

plt.plot(range(iterations), cost_history)
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.show()

在这里插入图片描述

我们通过画图的方式展示了模型拟合的结果,同时也可以看到成本函数随着迭代次数的变化。

3、sklearn内置模块实现

下面是使用sklearn内置模块实现线性回归模型的梯度下降法的实战案例:
导入模块

from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

首先使用make_regression函数生成了一个模拟数据集,其中包含1000个样本,每个样本包含10个特征,噪声为10:

X, y = make_regression(n_samples=1000, n_features=10, noise=10)

然后使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占20%:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

接下来,使用SGDRegressor模型构建了一个梯度下降模型,并将alpha参数设置为0.1,learning_rate参数设置为’constant’,eta0参数设置为0.01,max_iter参数设置为1000:

sgd = SGDRegressor(alpha=0.1, learning_rate='constant', eta0=0.01, max_iter=1000)

然后,使用fit方法拟合了模型,并使用predict方法预测了测试集的结果:

# 拟合模型
sgd.fit(X_train, y_train)

# 预测
y_pred = sgd.predict(X_test)

最后,使用mean_squared_error函数计算了预测结果的均方误差:

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("mse:", mse)

在这里插入图片描述

需要注意的是,每次运行代码时,生成的模拟数据集都会不同,因此每次运行时计算的均方误差可能会不同。


📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

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

相关文章

1漏洞发现

漏洞发现-操作系统之漏洞探针类型利用修复 一、操作系统漏洞思维导图 相关名词解释&#xff1a; CVSS&#xff08;Common Vulnerability Scoring System&#xff0c;即“通用漏洞评分系统”&#xff09; CVSS是安全内容自动化协议&#xff08;SCAP&#xff09;的一部分通常C…

rockchip rk3588添加uvc及uvc,adb的复合设备

软硬件环境&#xff1a; 软件基础&#xff1a;我目前拿到的rk3588 sdk &#xff1a;gitwww.rockchip.com.cn:2222/Android_S/rk3588- manifests.git硬件基础&#xff1a;RK3588 LP4X EVB uvc_app: 从rv1126 sdk中rv1126_sdk/rv1126/external/uvc_app 目录移植而来。移植后&…

能翻译大量文字的软件-正规的翻译软件

复制自动翻译软件是一种能够复制并自动翻译文本的工具。当您阅读某一种语言的文本时&#xff0c;这种软件可以快速识别并翻译出来&#xff0c;以方便您更好地理解内容。与其他翻译软件不同的是&#xff0c;复制自动翻译软件可以直接在游览网站的过程中&#xff0c;直接对用户正…

【C++】命名空间,缺省参数,函数重载,引用,内联函数

目录1. 命名空间2. 输入输出3. 缺省参数4. 函数重载为什么C支持函数重载&#xff1f;5. 引用5.1 引用作函数参数&#xff08;输出型参数&#xff09;5.2 作函数的返回值关于函数的返回值&#xff1a;5.3 引用权限关于类型转换&#xff1a;5.4 引用和指针6. 内联函数6.1 C推荐的…

【千题案例】TypeScript获取两点之间的距离 | 中点 | 补点 | 向量 | 角度

我们在编写一些瞄准、绘制、擦除等功能函数时&#xff0c;经常会遇到计算两点之间的一些参数&#xff0c;那本篇文章就来讲一下两点之间的一系列参数计算。 目录 1️⃣ 两点之间的距离 ①实现原理 ②代码实现及结果 2️⃣两点之间的中点 ①实现原理 ②代码实现及结果 3…

JUC结构

JUC是java.util.concurrent包的简称在Java5.0添加&#xff0c;目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题&#xff01;进程与线程的区别&#xff1a;进程 : 一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程…

count、sum、avg、max、min函数MySQL数据库 - 使用聚合函数查询(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴&#xff0c;并无盈利目的&#xff0c;尊重版权&#xff0c;如有侵犯&#xff0c;请官方工作人员联系博主谢谢。 目录 第1关&#xff1a;COUNT( )函数 任务描述 相关知识 COUNT()函数基本使用 编程要求 第2关&#xff1a;SUM(…

3.Java运算符

Java运算符 运算符基本分为六类&#xff1a;算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、三元&#xff08;条件&#xff09;运算符。 一、算术运算符 算数运算符&#xff0c;是指在Java运算中&#xff0c;计算数值类型的计算符号&#xff0c;既然是操作数值…

ubuntu下安装与配置samba

参考文章&#xff1a; https://blog.csdn.net/xurongxin2006/article/details/127740629 https://blog.csdn.net/weixin_42758707/article/details/129855529 https://www.linuxidc.com/Linux/2018-11/155466.htm https://blog.csdn.net/flyingcys/article/details/50673167 1、…

SGD,Adam,AdamW,LAMB优化器

一. SGD&#xff0c;Adam&#xff0c;AdamW&#xff0c;LAMB优化器 优化器是用来更新和计算影响模型训练和模型输出的网络参数&#xff0c;使其逼近或达到最优值&#xff0c;从而最小化(或最大化)损失函数。 1. SGD 随机梯度下降是最简单的优化器&#xff0c;它采用了简单的…

Qt音视频开发37-识别鼠标按下像素坐标

一、前言 在和视频交互过程中&#xff0c;用户一般需要在显示视频的通道上点击对应的区域&#xff0c;弹出对应的操作按钮&#xff0c;将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合&#xff0c;发送出去&#xff0c;通知其他设备进行处理。比如识别到很多人脸&…

使用 gzip 压缩数据

gzip 是GNU/Linux平台下常用的压缩软件&#xff0c;处理后缀名.gz的文件。 gzip 、 gunzip 和 zcat 都可以处理这种格式的。但这些工具只能压缩/解压缩单个文件或数据流&#xff0c;无法直接归档目录和多个文件。但是&#xff0c; gzip 可以同tar 和 cpio 这类归档工具配合使用…

JavaWeb——网络的基本概念

目录 一、IP地址 1、定义 2、格式 &#xff08;1&#xff09;、A类地址 &#xff08;2&#xff09;、B类地址 &#xff08;3&#xff09;、C类地址 &#xff08;4&#xff09;、特殊地址 二、端口号 三、协议 四、协议分层 1、定义 2、分类 &#xff08;1&#xf…

pytorch进阶学习(六):如何对训练好的模型进行优化、验证并且对训练过程进行准确率、损失值等的可视化,新手友好超详细记录

课程资源&#xff1a; 7、模型验证与训练过程可视化【小学生都会的Pytorch】【提供源码】_哔哩哔哩_bilibili 推荐与上一节笔记搭配食用~&#xff1a; pytorch进阶学习&#xff08;五&#xff09;&#xff1a;神经网络迁移学习应用的保姆级详细介绍&#xff0c;如何将训练好…

给boss直聘的搜索结果加上hr活跃状态,少看点半年活跃的岗位,有书签版,油猴版

背景&#xff1a;这段时间找工作&#xff0c;无奈大环境不好&#xff0c;所在城市大部分公司都投了。就是没几个回复的&#xff0c;要么送达&#xff0c;要么已读不回&#xff0c;要么拿了简历没见邀约。然后boss为了争取我们多浏览网站&#xff0c;把一些陈年老醋也拿上台面&a…

企业云盘如何实现文件共享?

企业文件共享的方式有很多&#xff0c;最常见的就是使用第三方企业云盘工具进行文件实时共享&#xff0c;这种方法不仅方便安全&#xff0c;而且兼容性高。 企业云盘主要是通过建立企业内部共享文件夹进行文件分享&#xff0c;支持通过权限管控来保障文件的安全&#xff0c;管理…

SonarQube踩坑:本地利用maven进行代码SonarQube静态扫描

1、ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count SonarQube内置ElasticSearch内存不够 - 解决办法&#xff1a;修改内存配置大小 - 查询当前配置内存&#xff1a;sysctl -a | grep vm.max_map_count - 更改内存大小&#xff1a;sysctl …

SpringBoot集成Camunda流程引擎 (一)

一、匹配版本简介 首先官网camunda7.17对应的springboot版本。camunda官网 camunda中文手册:Camunda 中文站 | docs.camunda.org 使用camunda流程引擎、web界面、Rest服务接口相应依赖如下: 流程引擎:camunda-bpm-spring-boot-starterRest服务接口:camunda-bpm…

深度学习中的两阶段目标检测

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

第五元素奏鸣曲:企业的新数据之道

1997年&#xff0c;吕克贝松指导的经典电影《第五元素》上映&#xff0c;引发了全球的科幻热潮。影片中&#xff0c;各界都在为追逐第五元素而努力。有趣的是&#xff0c;二十年过去&#xff0c;千行百业与亿万企业开始共同追逐一种新的“第五元素”——数据。数据之所以有这个…