【Python机器学习】1.2. 线性回归理论:一元线性回归、最小化平方误差和公式(SSE)、梯度下降法

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
在这里插入图片描述

1.2.1. 什么是回归分析(Regressive Analysis)?

一些例子

举一些例子吧:

下图是一个每百万人医生数和人均寿命的关系图,其中散点是我们收集到的数据,而拟合出的曲线是我们需要找出的:
请添加图片描述

下图是一个年龄与身高的关系图,其中散点是收集到的数据,我们的目标是找到一条拟合曲线:
请添加图片描述

定义

相信看过上文两个例子之后你对回归分析又了一定的认识,这里我直接给出回归分析的定义:

根据数据,确定两种或两种以上变量间相互依赖的定量关系。

其函数表达式为: y = f(x_1, x_2 , …, x_n)

回归分析的分类

回归分析有很多种。

如果我们以变量数来分类,有:

  • 一元回归:y = f(x)
  • 多元回归:y = f(x_1, x_2 , …, x_n)

如果我们以函数关系来分类,有:

  • 线性回归:y = ax + b
  • 非线性回归:y = ax^2 + bx + c

1.2.2. 线性回归

线性回归指的是回归分析中,变量与因变量间存在线性关系。其函数表达式为:y = ax + b

回归问题求解

问题:面积为110平方米的房子售价150万是否值得投资?

面积(A)售价§
79404,976
92948,367
1081,049,007
110???
118578,142

我们要回答这个问题一般来说要分成以下几步去完成:

  • 确定PA之间的关系:P = f(A)
  • 根据关系预测合理价格:P(A = 110) = f(110)
  • 做出判断

这3步中最核心的问题就是第一步——找关系。

下图是根据表格数据整理出的散点图:
请添加图片描述

我们的目标就是要找到这条黑色的拟合曲线的对应的函数式是怎么写的。

这里我们假设这条拟合曲线是线性函数,也就是y = ax + b,所以我们真正的目标其实就是找到合理的参数a和b的值。

1.2.3. 最小化平方误差和公式

把问题进行以下转换:假设x为变量,y为对应的结果,y’(也就是ax + b)为模型输出的结果。这时候我们的目标就是让y’尽可能地接近y,也就是最小化 平方误差和(Sum of Squared Errors, SSE):
minimize { ∑ i = 1 m ( y i ′ − y i ) 2 } \textit{minimize} \left\{ \sum_{i=1}^{m} (y'_i - y_i)^2 \right\} minimize{i=1m(yiyi)2}

  • m:数据样本的数量。
  • y_i:第i个样本的真实值(ground truth)。
  • y‘_i:第i个样本的预测值(由模型计算得到)。
  • (y'_i - y_i)^2:每个样本的误差平方,表示预测值与真实值之间的偏差。
  • i = 1:i是数据点的索引,i = 1是指索引的起始值为1

我们还需要对这个公式进行一个变换:
minimize { 1 2 m ∑ i = 1 m ( y i ′ − y i ) 2 } \textit{minimize} \left\{ \frac{1}{2m} \sum_{i=1}^{m} (y'_i - y_i)^2 \right\} minimize{2m1i=1m(yiyi)2}

该公式多了一个1/2m,主要是为了在梯度下降时更方便求导:
d d θ 1 2 m ∑ i = 1 m ( y ′ i − y i ) 2 \frac{d}{d\theta} \frac{1}{2m} \sum{i=1}^{m} (y{\prime}_i - y_i)^2 dθd2m1i=1m(yiyi)2
导数中的2会被消去,使更新公式更简洁。由于m是一个常数,所以这个变换并不会影响最后得出的a和b的值。

一点名词解释

  • 梯度下降是一种优化算法,用于最小化函数(如机器学习模型的损失函数)。在机器学习和深度学习中,梯度下降用于优化模型参数,使损失函数的值最小化。
  • 求导就是计算函数的斜率,描述一个变量如何随另一个变量的变化而变化。

一个小例子

我们来看一个小例子吧:
![[1.2. 线性回归理论/mat.png]]

  • 黑色散点:代表真实值y
  • 蓝色折线:代表预测值y'_1
  • 红色折线:代表预测值y'_2
    可以清楚地看到, y'_1y'_2的趋势与y的分布情况。 y'_1 接近真实值,而y'_2变化趋势相反。

以下是数据的表格统计:

xyy’_1y’_2
110.54
2213
331.52

接下来我们就用上文讲过的SSE公式的变形来算误差:
J 1 = 1 2 m ∑ i = 1 m ( y 1 ′ − y ) 2 = 1 2 × 3 × ( ( 0.5 − 1 ) 2 + ( 1 − 2 ) 2 + ( 1.5 − 3 ) 2 ) = 0.583 J_1 = \frac{1}{2m} \sum_{i=1}^{m} (y'_1 - y)^2 = \frac{1}{2 \times 3} \times \left( (0.5 - 1)^2 + (1 - 2)^2 + (1.5 - 3)^2 \right) = 0.583 J1=2m1i=1m(y1y)2=2×31×((0.51)2+(12)2+(1.53)2)=0.583
J 2 = 1 2 m ∑ i = 1 m ( y 2 ′ − y ) 2 = 1 2 × 3 × ( ( 4 − 1 ) 2 + ( 3 − 2 ) 2 + ( 2 − 3 ) 2 ) = 1.83 J_2 = \frac{1}{2m} \sum_{i=1}^{m} (y'_2 - y)^2 = \frac{1}{2 \times 3} \times \left( (4 - 1)^2 + (3 - 2)^2 + (2 - 3)^2 \right) = 1.83 J2=2m1i=1m(y2y)2=2×31×((41)2+(32)2+(23)2)=1.83
可以看到,跟图中所展现的关系一样,J_1明显小于J_2,代表y'_1的误差明显小于y'_2


一点题外话:上面的折线图是用matplotlib生成的哦,你也可以试着使用表格中的数据用Python写出一样的效果。我在下面提供了Python源码,写完之后你可以对照一下:

import matplotlib.pyplot as plt# 数据
x = [1, 2, 3]
y = [1, 2, 3]        # 真实值
y1_pred = [0.5, 1, 1.5]  # 预测值1
y2_pred = [4, 3, 2]  # 预测值2# 创建图表
plt.figure(figsize=(8, 5))# 绘制真实值的散点图
plt.scatter(x, y, color='black', marker='x', label="y (真实值)")# 绘制 y'_1 折线图
plt.plot(x, y1_pred, marker='o', linestyle='-', color='blue', label="y'_1 (预测值1)")# 绘制 y'_2 折线图
plt.plot(x, y2_pred, marker='o', linestyle='-', color='red', label="y'_2 (预测值2)")# 标注
plt.xlabel("x")
plt.ylabel("y")
plt.title("真实值与预测值对比")
plt.legend()
plt.grid(True)# 显示图表
plt.show()

1.2.4. 梯度下降法

OK,让我们回到正题。我们真正要求的是y = ax + b中a和b的值,所以我们还得变换一下SSE公式,让函数的参数变为a和b。其实这一步变化也很简单,就是把原函数中的y'_i替换成ax_i + b即可:
J = 1 2 m ∑ i = 1 m ( y i ′ − y i ) 2 = 1 2 m ∑ i = 1 m ( a x i + b − y i ) 2 = g ( a , b ) J = \frac{1}{2m} \sum_{i=1}^{m} (y'_i - y_i)^2 = \frac{1}{2m} \sum_{i=1}^{m} (a x_i + b - y_i)^2 = g(a, b) J=2m1i=1m(yiyi)2=2m1i=1m(axi+byi)2=g(a,b)

为了让这个损失函数尽可能的小,我们就需要梯度下降法

  • 它是寻找极小值的一种方法。通过向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索,直到在极小点收敛。
  • “收敛”指的是趋向于某个极限值(比如一个函数的最大值/最小值)

假设:
J = f ( p ) J = f(p) J=f(p)
那么对于p使用梯度下降法的公式就是:
p i + 1 = p i − α ∂ ∂ p i f ( p i ) p_{i+1} = p_i - \alpha \frac{\partial}{\partial p_i} f(p_i) pi+1=piαpif(pi)

  • p_i+1是更新后的参数值,由当前值p_i进行调整
  • α(学习率):控制每次更新的步长
  • α后面跟的那一串是函数f(p) 在当前点p_i处的梯度(偏导数),表示f(p)在该点变化的方向和大小。

我们以亲民的方式讲解一下梯度,你可以把梯度(Gradient) 想象成坡的陡峭程度和方向

  • 如果坡很陡(梯度大),你往下走就会很快。
  • 如果坡很平缓(梯度小),你往下走就会慢一点。
  • 如果到了山谷(梯度接近 0),说明你已经走到了最低点(最优解)。

数学上的梯度,其实就是告诉你:

  • “你现在所处的位置,往哪个方向下降最快?而且下降的速度是多少?”

我们再用这个例子解释一下梯度下降法的步骤:

  • 你站在山上,不知道最低点在哪(开始训练)
  • 你用脚感受坡的方向(计算梯度)
  • 你沿着坡最陡的下坡方向走一步(更新参数)
  • 你重复这个过程,每次都调整方向(不断优化)
  • 走到坡度几乎没有变化的地方(梯度接近 0),你就到达了山谷(找到最优解)

举个例子我们来一步步算,假设我们有一个简单的函数
J ( a ) = ( a − 3 ) 2 J(a) = (a - 3)^2 J(a)=(a3)2

只要是有中学学历都能一眼看出来最小值在3,但我们就假装不知道,用梯度下降法一步步算:

1. 计算梯度

梯度就是函数的导数,我们先求出J(a)a的导数:
d J d a = 2 ( a − 3 ) \frac{dJ}{da} = 2(a - 3) dadJ=2(a3)
这个梯度告诉我们:当前的a离3还有多远,以及它应该往哪个方向调整。

2. 设定初始值

我们随便选个起点,比如a = 0,然后逐步优化它。

3. 更新a

梯度下降的更新公式是:
a : = a − α ⋅ d J d a a := a - \alpha \cdot \frac{dJ}{da} a:=aαdadJ

  • α学习率,我们设α = 0.1(步子大小)

刚才我们设了a = 0,所以这时候梯度是:
d J d a = 2 ( 0 − 3 ) = − 6 \frac{dJ}{da} = 2(0 - 3) = -6 dadJ=2(03)=6
代入更新公式:
a : = 0 − 0.1 × ( − 6 ) a := 0 - 0.1 \times (-6) a:=00.1×(6)
a = 0 + 0.6 = 0.6 a = 0 + 0.6 = 0.6 a=0+0.6=0.6
更新后,a从0变成了0.6,朝着正确的方向移动了!

4. 不断重复

我们一直不断重复这个步骤:

迭代次数a 当前值计算梯度更新后的 a
10.0-60.6
20.6-4.81.08
31.08-3.841.464
41.464-3.0721.7712
51.7712-2.45762.01696

可以看到, a一步步向3逼近!如果继续迭代,最终会非常接近a = 3

这个方法以后我们在讲回归逻辑和神经网络时还会遇到的,所以大家务必铭记。


1.2.5. 对ab使用梯度下降法

回到我们之前变换过后,参数是ab的SSE函数:
J = 1 2 m ∑ i = 1 m ( y i ′ − y i ) 2 = 1 2 m ∑ i = 1 m ( a x i + b − y i ) 2 = g ( a , b ) J = \frac{1}{2m} \sum_{i=1}^{m} (y'_i - y_i)^2 = \frac{1}{2m} \sum_{i=1}^{m} (a x_i + b - y_i)^2 = g(a, b) J=2m1i=1m(yiyi)2=2m1i=1m(axi+byi)2=g(a,b)

ab使用梯度下降法非常简单且暴力:
$$
\begin{cases}

temp_a = a - \alpha \frac{\partial}{\partial a} g(a,b) = a - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (a x_i + b - y_i)x_i \

temp_b = b - \alpha \frac{\partial}{\partial b} g(a,b) = b - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (a x_i + b - y_i)

\end{cases}
‘ t e m p a ‘ 和 ‘ t e m p b ‘ 是 临 时 的 变 量 。 经 过 一 次 计 算 后 , 我 们 对 ‘ a ‘ 和 ‘ b ‘ 进 行 一 次 更 新 , 把 ‘ t e m p a ‘ 和 ‘ t e m p b ‘ 分 别 赋 给 它 们 : `temp_a`和`temp_b`是临时的变量。经过一次计算后,我们对`a`和`b`进行一次更新,把`temp_a`和`temp_b`分别赋给它们: tempatempbabtempatempb
a = temp_a

b = temp_b
$$
然后再进行一次计算,一次更新,就这样一直重复直到函数收敛。

这里我们展示的是一元的线性回归,其实多元线性回归也是一样的思路,使用梯度下降法。只不过参数会不止ab,还有cde等等。

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

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

相关文章

golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)

目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险: 5.2漏洞利用: 5.3JavaScript 与 Native 代码通信 六、Chr…

算法日常刷题笔记(3)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第三篇笔记 笔记时间为2月24日到3月2日 第一天 设计有序流 设计有序流https://leetcode.cn/problems/design-an-ordered-stream/ 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数&#xff…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码

本文项目编号 T 098 ,文末自助获取源码 \color{red}{T098,文末自助获取源码} T098,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

三数之和_算法

1.题目描述 首先我们分析下这道题目:假设给我们一个数组,让数组某三个不同下标的数相加最终得0,那么我就返回这三个数.但是如果返回的多个数组中的元素相同,那么我们还要删掉其中一个保留一个. 注意:这道题的重点是三个数的下标不能相等并且返回的数组中的元素也不能相等,通过…

关于Deepseek本地部署硬件环境检查教程

要在电脑上本地部署DeepSeek,需要关注以下硬件和软件配置: 硬件配置 CPU:至少4核CPU,推荐Intel i5/i7或AMD Ryzen 5/7系列处理器。内存:至少8GB DDR4内存,推荐16GB DDR4内存,对于大型模型建议…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)

前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会有一个InputAction类型的文件,名字为InputSystem_Ac…

250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置

A. 配置Docker中的代理 绿联NAS简单解决docker无法获取镜像-不用软路由 - 哔哩哔哩 B. 下载官网对应的镜像 群晖NAS用docker搭建SearXNG元搜索引擎_哔哩哔哩_bilibili C. 修改默认省略的参数,只配置Base_URL,删除其它默认的空缺项 searxng-docker/REA…

C++-第十九章:异常

目录 第一节:异常有哪些 第二节:异常相关关键字 2-1.抛出异常 2-2.捕获异常 2-3.异常的捕获规则 2-3-1.异常被最近的catch捕获 2-3-2.catch捕获的是异常的拷贝 2-3-3.异常为子类时,可以用父类引用接收 2-4.捕获任意异常 第三节&#xff1…

Redis详解(实战 + 面试)

目录 Redis 是单线程的!为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源,一块为控制电路和传感器电路供电,另一块单独为电机供电。分开供电这样做的好处,有利于减小干扰,提高系统稳定性。 LM7805是常用的三端稳压器件,顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB AOF。第3章:使用Server自带的redis-cli工具连接。第4章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…

Redis 实战篇 ——《黑马点评》(下)

《引言》 (下)篇将记录 Redis 实战篇 最后的一些学习内容,希望大家能够点赞、收藏支持一下 Thanks♪ (・ω・)ノ,谢谢大家。 传送门(上):Redis 实战篇 ——《黑马…

WordPress二次开发实现用户注册审核功能

WordPress默认直接注册登录了,不需要任何验证,如果被批量注册就麻烦了,所以添加一个审核功能比较好。 注册用户默认需要手动审核,审核以后才能登陆,开启审核,可以有效防止用户批量注册。 这儿讲解一下如何…