【线性回归】梯度下降

news2025/1/18 10:05:50

文章目录

    • @[toc]
      • 数据
        • 数据集
        • 实际值
        • 估计值
      • 梯度下降算法
        • 估计误差
        • 代价函数
        • 学习率
        • 参数更新
      • `Python`实现
        • 导包
        • 数据预处理
        • 迭代过程
        • 结果可视化
        • 完整代码
      • 结果可视化
        • 线性拟合结果
        • 代价变化

数据

数据集

( x ( i ) , y ( i ) ) , i = 1 , 2 , ⋯   , m \left(x^{(i)} , y^{(i)}\right) , i = 1 , 2 , \cdots , m (x(i),y(i)),i=1,2,,m

实际值

y ( i ) y^{(i)} y(i)

估计值

h θ ( x ( i ) ) = θ 0 + θ 1 x ( i ) h_{\theta}\left(x^{(i)}\right) = \theta_{0} + \theta_{1} x^{(i)} hθ(x(i))=θ0+θ1x(i)


梯度下降算法

估计误差

h θ ( x ( i ) ) − y ( i ) h_{\theta}\left(x^{(i)}\right) - y^{(i)} hθ(x(i))y(i)

代价函数

J ( θ ) = J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 m ∑ i = 1 m ( θ 0 + θ 1 x ( i ) − y ( i ) ) 2 J(\theta) = J(\theta_{0} , \theta_{1}) = \cfrac{1}{2m} \displaystyle\sum\limits_{i = 1}^{m}{\left(h_{\theta}\left(x^{(i)}\right) - y^{(i)}\right)^{2}} = \cfrac{1}{2m} \displaystyle\sum\limits_{i = 1}^{m}{\left(\theta_{0} + \theta_{1} x^{(i)} - y^{(i)}\right)^{2}} J(θ)=J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2=2m1i=1m(θ0+θ1x(i)y(i))2

学习率
  • α \alpha α是学习率,一个大于 0 0 0的很小的经验值,决定代价函数下降的程度
参数更新

Δ θ j = ∂ ∂ θ j J ( θ 0 , θ 1 ) \Delta{\theta_{j}} = \cfrac{\partial}{\partial{\theta_{j}}} J(\theta_{0} , \theta_{1}) Δθj=θjJ(θ0,θ1)

θ j : = θ j − α Δ θ j = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \theta_{j} := \theta_{j} - \alpha \Delta{\theta_{j}} = \theta_{j} - \alpha \cfrac{\partial}{\partial{\theta_{j}}} J(\theta_{0} , \theta_{1}) θj:=θjαΔθj=θjαθjJ(θ0,θ1)

$$
\left[
\begin{matrix}
\theta_{0} \
\theta_{1}
\end{matrix}
\right] :=

\left[
\begin{matrix}
\theta_{0} \
\theta_{1}
\end{matrix}
\right] -
\alpha

\left[
\begin{matrix}
\cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{0}}} \
\cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{1}}}
\end{matrix}
\right]
$$

[ ∂ J ( θ 0 , θ 1 ) ∂ θ 0 ∂ J ( θ 0 , θ 1 ) ∂ θ 1 ] = [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) ] = [ 1 m ∑ i = 1 m e ( i ) 1 m ∑ i = 1 m e ( i ) x ( i ) ] e ( i ) = h θ ( x ( i ) ) − y ( i ) \left[ \begin{matrix} \cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{0}}} \\ \cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{1}}} \end{matrix} \right] = \left[ \begin{matrix} \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{\left(h_{\theta}\left(x^{(i)}\right) - y^{(i)}\right)} \\ \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{\left(h_{\theta}\left(x^{(i)}\right) - y^{(i)}\right) x^{(i)}} \end{matrix} \right] = \left[ \begin{matrix} \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{e^{(i)}} \\ \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{e^{(i)} x^{(i)}} \end{matrix} \right] \kern{2em} e^{(i)} = h_{\theta}\left(x^{(i)}\right) - y^{(i)} θ0J(θ0,θ1)θ1J(θ0,θ1) = m1i=1m(hθ(x(i))y(i))m1i=1m(hθ(x(i))y(i))x(i) = m1i=1me(i)m1i=1me(i)x(i) e(i)=hθ(x(i))y(i)

[ ∂ J ( θ 0 , θ 1 ) ∂ θ 0 ∂ J ( θ 0 , θ 1 ) ∂ θ 1 ] = [ 1 m ∑ i = 1 m e ( i ) 1 m ∑ i = 1 m e ( i ) x ( i ) ] = [ 1 m ( e ( 1 ) + e ( 2 ) + ⋯ + e ( m ) ) 1 m ( e ( 1 ) x ( 1 ) + e ( 2 ) x ( 2 ) + ⋯ + e ( m ) x ( m ) ) ] = 1 m [ 1 1 ⋯ 1 x ( 1 ) x ( 2 ) ⋯ x ( m ) ] [ e ( 1 ) e ( 2 ) ⋮ e ( m ) ] = 1 m X T e = 1 m X T ( X θ − y ) \begin{aligned} \left[ \begin{matrix} \cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{0}}} \\ \cfrac{\partial{J(\theta_{0} , \theta_{1})}}{\partial{\theta_{1}}} \end{matrix} \right] &= \left[ \begin{matrix} \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{e^{(i)}} \\ \cfrac{1}{m} \displaystyle\sum\limits_{i = 1}^{m}{e^{(i)} x^{(i)}} \end{matrix} \right] = \left[ \begin{matrix} \cfrac{1}{m} \left(e^{(1)} + e^{(2)} + \cdots + e^{(m)}\right) \\ \cfrac{1}{m} \left(e^{(1)} x^{(1)} + e^{(2)} x^{(2)} + \cdots + e^{(m)} x^{(m)}\right) \end{matrix} \right] \\ &= \cfrac{1}{m} \left[ \begin{matrix} 1 & 1 & \cdots & 1 \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \end{matrix} \right] \left[ \begin{matrix} e^{(1)} \\ e^{(2)} \\ \vdots \\ e^{(m)} \end{matrix} \right] = \cfrac{1}{m} X^{T} e = \cfrac{1}{m} X^{T} (X \theta - y) \end{aligned} θ0J(θ0,θ1)θ1J(θ0,θ1) = m1i=1me(i)m1i=1me(i)x(i) = m1(e(1)+e(2)++e(m))m1(e(1)x(1)+e(2)x(2)++e(m)x(m)) =m1[1x(1)1x(2)1x(m)] e(1)e(2)e(m) =m1XTe=m1XT(y)

  • 由上述推导得

Δ θ = 1 m X T e \Delta{\theta} = \cfrac{1}{m} X^{T} e Δθ=m1XTe

θ : = θ − α Δ θ = θ − α 1 m X T e \theta := \theta - \alpha \Delta{\theta} = \theta - \alpha \cfrac{1}{m} X^{T} e θ:=θαΔθ=θαm1XTe


Python实现

导包
import numpy as np
import matplotlib.pyplot as plt
数据预处理
x = np.array([4, 3, 3, 4, 2, 2, 0, 1, 2, 5, 1, 2, 5, 1, 3])
y = np.array([8, 6, 6, 7, 4, 4, 2, 4, 5, 9, 3, 4, 8, 3, 6])

m = len(x)

x = np.c_[np.ones((m, 1)), x]
y = y.reshape(m, 1)
迭代过程
alpha = 0.01  # 学习率
iter_cnt = 1000  # 迭代次数
cost = np.zeros(iter_cnt)  # 代价数据
theta = np.zeros((2, 1))

for i in range(iter_cnt):
    h = x.dot(theta)  # 估计值
    error = h - y  # 误差值
    cost[i] = 1 / (2 * m) * error.T.dot(error)  # 代价值
    # cost[i] = 1 / (2 * m) * np.sum(np.square(error))  # 代价值

    # 更新参数
    delta_theta = 1 / m * x.T.dot(error)
    theta -= alpha * delta_theta
结果可视化
# 线性拟合结果
plt.scatter(x[:, 1], y, c='blue')
plt.plot(x[:, 1], h, 'r-')
plt.savefig('../pic/fit.png')
plt.show()

# 代价结果
plt.plot(cost)
plt.savefig('../pic/cost.png')
plt.show()
完整代码
import numpy as np
import matplotlib.pyplot as plt

x = np.array([4, 3, 3, 4, 2, 2, 0, 1, 2, 5, 1, 2, 5, 1, 3])
y = np.array([8, 6, 6, 7, 4, 4, 2, 4, 5, 9, 3, 4, 8, 3, 6])

m = len(x)

x = np.c_[np.ones((m, 1)), x]
y = y.reshape(m, 1)

alpha = 0.01  # 学习率
iter_cnt = 1000  # 迭代次数
cost = np.zeros(iter_cnt)  # 代价数据
theta = np.zeros((2, 1))

for i in range(iter_cnt):
    h = x.dot(theta)  # 估计值
    error = h - y  # 误差值
    cost[i] = 1 / (2 * m) * error.T.dot(error)  # 代价值
    # cost[i] = 1 / (2 * m) * np.sum(np.square(error))  # 代价值

    # 更新参数
    delta_theta = 1 / m * x.T.dot(error)
    theta -= alpha * delta_theta

# 线性拟合结果
plt.scatter(x[:, 1], y, c='blue')
plt.plot(x[:, 1], h, 'r-')
plt.savefig('../pic/fit.png')
plt.show()

# 代价结果
plt.plot(cost)
plt.savefig('../pic/cost.png')
plt.show()

结果可视化

线性拟合结果

1

代价变化

2


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

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

相关文章

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理,下图是一个大佬整理的网络整体的流程图,清晰明了,其实再了解自注意力机制和多头自注意力机制后,再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发,ViT算法尝…

Linux远程登录方式ssh与vnc的区别

ssh登录 ssh是基于非对称密钥加密登录服务器 vnc登录 vnc登录相当于Linux图形界面的方式登录 为什么需要多种登录方式 在ssh无法远程登录时,可以使用vnc登录。新安装的虚拟机不一定会安装或启用ssh服务,并且要实现ssh的远程登录,linux防…

字符串的定义和操作 继续!

字符串的定义和操作 1)定义 与列表、元组一样,字符串也可以通过下标进行访问 从前向后,下标从0开始 从后向前,下标从-1开始 my_str "green" # 通过下标索引取值 value my_str[0] value2 my_str[-5] print(f&quo…

k8s pv 一直是release状态

如下图所示,pv 一直是release状态 这个时候大家可能就会想到现在我的 PVC 被删除了,PV 也变成了 Released 状态,那么我重建之前的 PVC 他们不就可以重新绑定了,事实并不会,PVC 只能和 Available 状态的 PV 进行绑定。…

什么是谷歌爬虫?

其实就是谷歌用来浏览网络信息的一个自动化程序,他们会在你的网站爬取,寻找和搜集信息,谷歌爬虫可以说决定着一个网站在谷歌的生死 谷歌爬虫的作用机制就在于发现新网站以及新网页,然后他会把网页的内容带回去,更新到…

嵌入式科普(18)Ubuntu在移动硬盘的安装和启动

目录 一、概述 二、应用场景 三、移动硬盘安装Ubuntu 3.1 移动硬盘格式化 3.2 VMware安装Ubuntu到移动硬盘 四、电脑BIOS启动移动硬盘Ubuntu 五、从VMware启动移动硬盘Ubuntu 六、问题解决(坑)和思考提问 嵌入式科普(18)Ubuntu在移动硬盘的安装和启动 一、概述 在移动硬…

Thingsboard规则链:Entity Type Filter节点详解

在物联网(IoT)的世界里,数据的多样性与复杂性要求处理架构具备高度的灵活性和针对性。ThingsBoard作为一款强大的物联网平台,通过其规则链(Rule Chains)机制,让数据的自动化处理变得既强大又灵活…

设计模式7——建造者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 建造者模式(Builde…

C++下的内存管理

文章目录 内存分布C语言中动态内存管理方法C内存管理new/delete操作内置类型new和delete操作自定义类型operator new 和 operator deletenew和delete的实现原理定位new表达式 malloc/free和new/delete的区别内存泄漏 内存分布 栈:又叫做堆栈–非静态局部变量/函数参…

Sketch v100 for Mac 安装教程【支持M芯片】

Sketch v100 for Mac 安装教程【支持M芯片】 原文地址:https://blog.csdn.net/weixin_48311847/article/details/139104315

秀某动预约抢票脚本

秀某动预约抢票脚本 小白操作-仅供学习参考 主要流程和功能 初始化和配置变量: confirm_url 和 login_url: 分别存储登录和确认订单的URL。 wait_time: 用户输入的提前多少秒开始执行。 start_time: 开售时间。 DEBUG: 调试标志,用于控制脚本的行为。 浏览…

4. C++入门:内联函数、auto关键字、范围for及nullptr

内联函数 概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率 对比C的宏 C语言不足:宏 #define ADD(x, y) ((x)(y))int main() {int ret…

Spring框架中获取方法参数名称:DefaultParameterNameDiscoverer

DefaultParameterNameDiscoverer 是Spring框架中用于获取方法参数名称的一个类。在Java中,方法的参数名称通常在编译时会丢失,因为Java字节码并不强制要求保留这些信息。Spring提供了一种机制来恢复这些参数名称,这就是通过DefaultParameterN…

工厂模式(简单工厂模式+工厂模式)

工厂模式的目的就是将对象的创建过程隐藏起来,从而达到很高的灵活性,工厂模式分为三类: 简单工厂模式工厂方法模式抽象工厂模式 在没有工厂模式的时候就是,客户需要一辆马车,需要客户亲自去创建一辆马车,…

javaSwing仓库商品管理系统(文档+视频+源码)

摘要 Java swing实现的一款简单的仓库商品管理系统,数据库采用的是mysql,本系统实现了两个角色层面的功能,管理员可以管理用户、仓库、商品信息等。普通用户登录后可以查看商品、仓库信息及个人信息。 系统实现 登录界面: 我们…

MySQL中锁的几种类型

MySQL根据加锁的范围,可以分为全局锁、表级锁、行级锁三类。 2.5.1. 锁定读 2.5.1.1. 共享锁和独占锁 事务的 读-读 情况并不会引起什么问题,对于 写-写、读-写 或 写-读 这些情况可能会引起一些问题,需要使用MVCC或者加锁的方式来解决。在…

ubuntu server 22.04 使用docker安装 onlyoffice 8.0同时添加中文字体、字号

本文主要介绍在ubuntu server 22.04 系统上使用docker安装onlyoffice 8.0同时添加中文字体、字号方法。 1、硬件要求 CPU:双核2 GHz或更高 内存:最少4GB 硬盘:至少40 GB可用空间 Swap file:至少4 GB,但取决于主机操作…

vmware 17pro17.5 bug 严重,建议升级17.52

近日vmware发布17.52 更新,修复了一个重大BUG. 也就是莫名其妙的CPU跟GPU占用问题。 我的系统是WIN11 跟VMWARE17.5..近日莫名其妙的发现即使什么都没运行,GPU占用也高达20%。开始以为中毒了被拿去挖矿了,后面看到VMWARE的这个更新&#xf…

最大连续1的个数(滑动窗口)

算法原理: 这道题大眼一看是关于翻转多少个0的问题,但是,如果你按照这种思维去做题,肯定不容易。所以我们要换一种思维去做,这种思维不是一下就能想到的,所以想不到也情有可原。 题目是:给定一…

中间件是什么?信创中间件有哪些牌子?哪家好用?

当今社会,中间件的重要性日益凸显,尤其是在信创背景下,选择适合的中间件产品对于推动企业数字化转型和升级具有重要意义。今天我们就来聊聊中间件是什么?信创中间件有哪些牌子?哪家好用?仅供参考哈&#xf…