如何用梯度下降法求解数学建模的拟合问题——以logistics增长问题为例

news2024/11/19 1:36:34

引言

众所周知的是,在大学课程中一般只会教授一种拟合方法(也即参数估计方法)——最小二乘法。这是一种直接求解的方法,非常的有效,不仅是损失最小解,而且是最大似然解。只不过,有一个缺点,它只能解决线性方程参数问题,对于非线性曲线,就无能为力了。大部分情况下还是将其转换成线性问题,再使用最小二乘法。

然而,并非所有的问题都能转换为线性问题,甚至并非所有目标建模公式的参数都能有解析解,其他学科如机器学习等学科如何解决这个参数估计问题?答案是——《最优化方法》,其中最常用的是梯度下降法,不去寻找解析解,而是寻找其导数/梯度。因为导数/梯度具有如下优点

  1. 导数/梯度永远指向数值变动最快的方向(梯度的性质)
  2. 导数/梯度(除非有边界和断点)永远指向一个到达极值的路径

我们的主要目标是
arg min ⁡ θ L ( θ ) = 1 n ∑ i = 1 n ( y i − f θ ( x i ) ) 2 \argmin_\theta L(\theta)=\dfrac{1}{n}\sum_{i=1}^{n} (y_i-f_\theta(x_i))^2 θargminL(θ)=n1i=1n(yifθ(xi))2
这是最小二乘问题,也叫均方误差最小化问题。其中 θ \theta θ就是我们想要求的参数。 f θ ( x ) f_\theta(x) fθ(x)就是我们的模型,即带有参数 θ \theta θ的函数。 x i , y i x_i,y_i xi,yi分别是数据中第 i i i对自变量和因变量。 L ( θ ) L(\theta) L(θ)是损失函数,用来衡量我们拟合的效果。
而梯度下降法的主要内容是
θ ← θ − η ∇ θ L u n t i l ∇ θ L = 0 \theta \gets \theta- \eta\nabla_\theta L \quad until \quad \nabla_\theta L=0 θθηθLuntilθL=0
其中 η \eta η是学习率,目的是不要让 θ \theta θ变动幅度过大(特别是一些有限制的量,比如log函数的底数),导致不能收敛。 ∇ θ \nabla_\theta θ是求对 θ \theta θ的梯度。取负号是因为梯度默认是增大函数值的方向,这里是最小化问题,所以取其相反数。由这里可知,梯度大小不是我们所需要的,我们只要梯度的方向。

问题引入

关于logistics增长问题,是这样的,假设某生物种群数量记为 N N N,最开始为常数 N 0 N_0 N0
假设有未知参数 r r r K K K,其中 r r r是固定增长率,表明在没有任何限制的情况下种群数量的增长速度。 K K K是环境容纳量,是表明某个环境对生物的限制导致的最大容纳数量。

它们的关系如下
d N d t = r × N × ( 1 − N K ) \dfrac{dN}{dt}=r\times N\times(1-\dfrac{N}{K}) dtdN=r×N×(1KN)
我们的数据是按照时间 t i t_i ti记录的种群数量 N i N_i Ni。我们的目标就是求出 r r r K K K
这是一条微分方程。关于它的原函数可以参考我写的另一篇文章
它的图像是这样的
其中 N 0 = 10 , r = 1 , K = 1000 N_0=10,r=1,K=1000 N0=10,r=1,K=1000。横坐标是时间 t t t,纵坐标是种群数量 N N N
在这里插入图片描述

链式求导法则

首先,我们先明确实际输出与目标输出,按照logistic公式,我们的输出
f i = f ( t i , N i ) = r × N i × ( 1 − N i K ) f_i=f(t_i,N_i)=r\times N_i\times(1-\dfrac{N_i}{K}) fi=f(ti,Ni)=r×Ni×(1KNi)
我们的目标
d N ( t i ) d t i ≈ N i + 1 − N i t i + 1 − t i \dfrac{dN(t_i)}{dt_i}\approx \dfrac{N_{i+1}-N_i}{t_{i+1}-t_i} dtidN(ti)ti+1tiNi+1Ni
如果我们更细究一点, d N ( t ξ i ) d t ξ i = N i + 1 − N i t i + 1 − t i , t ξ i ∈ [ t i , t i + 1 ] \dfrac{dN(t_{\xi_i})}{dt_{\xi_i}}= \dfrac{N_{i+1}-N_i}{t_{i+1}-t_i},t_{\xi_i}\in[t_i,t_{i+1}] dtξidN(tξi)=ti+1tiNi+1Ni,tξi[ti,ti+1]。我们可以大约令 N ξ i = N i + 1 + N i 2 , t ξ i = t i + 1 + t i 2 N_{\xi_i}=\frac{N_{i+1}+N_i}{2},t_{\xi_i}=\frac{t_{i+1}+t_i}{2} Nξi=2Ni+1+Ni,tξi=2ti+1+ti,将点 ( t ξ i , N ξ i ) (t_{\xi_i},N_{\xi_i}) (tξi,Nξi)对应导数认为 N ξ i ′ ≈ N i + 1 − N i t i + 1 − t i N_{\xi_i}'\approx\dfrac{N_{i+1}-N_i}{t_{i+1}-t_i} Nξiti+1tiNi+1Ni
那么损失函数
L ( r , K ) = 1 n − 1 ∑ i = 1 n − 1 ( N ξ i ′ − f ( t ξ i , N ξ i ) ) 2 = 1 n − 1 ∑ i = 1 n − 1 ( N ξ i ′ − f ξ i ) 2 L(r,K)=\dfrac{1}{n-1}\sum_{i=1}^{n-1} (N_{\xi_i}'-f(t_{\xi_i},N_{\xi_i}))^2=\dfrac{1}{n-1}\sum_{i=1}^{n-1} (N_{\xi_i}'-f_{\xi_i})^2 L(r,K)=n11i=1n1(Nξif(tξi,Nξi))2=n11i=1n1(Nξifξi)2

在logistics增长问题中,未知量是 r r r K K K,所以我们的目标是求出 ∇ r L , ∇ K L \nabla_r L,\nabla_K L rL,KL
∇ r L = ∂ L ∂ r , ∇ K L = ∂ L ∂ K \nabla_r L=\dfrac{\partial L}{\partial r},\quad\nabla_K L=\dfrac{\partial L}{\partial K} rL=rL,KL=KL
根据链式求导法则,我们有

∂ L ∂ r = ∑ i = 1 n − 1 ∂ L ∂ f ξ i ∂ f ξ i ∂ r \dfrac{\partial L}{\partial r}=\sum_{i=1}^{n-1}\dfrac{\partial L}{\partial f_{\xi_i}}\dfrac{\partial f_{\xi_i}}{\partial r} rL=i=1n1fξiLrfξi
同理 K K K也有类似形式。
而我们有
∂ L ∂ f ξ i = − 2 ( N ξ i ′ − f ξ i ) , ∂ f ξ i ∂ r = N ξ i ( 1 − N ξ i K ) , ∂ f ξ i ∂ K = r N ξ i 2 K 2 \dfrac{\partial L}{\partial f_{\xi_i}}=-2(N_{\xi_i}'-f_{\xi_i}),\quad\dfrac{\partial f_{\xi_i}}{\partial r}=N_{\xi_i}(1-\dfrac{N_{\xi_i}}{K}),\quad\dfrac{\partial f_{\xi_i}}{\partial K}=r\dfrac{N_{\xi_i}^2}{K^2} fξiL=2(Nξifξi),rfξi=Nξi(1KNξi),Kfξi=rK2Nξi2
所以
∇ r L = ∂ L ∂ r = − 2 ∑ i = 1 n − 1 ( N ξ i ′ − f ( t ξ i , N ξ i ) ) N ξ i ( 1 − N ξ i K ) ∇ K L = ∂ L ∂ K = − 2 ∑ i = 1 n − 1 ( N ξ i ′ − f ( t ξ i , N ξ i ) ) r N ξ i 2 K 2 \nabla_r L=\dfrac{\partial L}{\partial r}=-2\sum_{i=1}^{n-1}(N_{\xi_i}'-f(t_{\xi_i},N_{\xi_i}))N_{\xi_i}(1-\dfrac{N_{\xi_i}}{K})\\ \nabla_K L=\dfrac{\partial L}{\partial K}=-2\sum_{i=1}^{n-1}(N_{\xi_i}'-f(t_{\xi_i},N_{\xi_i}))r\dfrac{N_{\xi_i}^2}{K^2}\\ rL=rL=2i=1n1(Nξif(tξi,Nξi))Nξi(1KNξi)KL=KL=2i=1n1(Nξif(tξi,Nξi))rK2Nξi2

实践

首先是数据的生成

import numpy as np
N0=10
K_real=1000
r_real=1
c=math.log(N0/(K_real-N0))

#原函数
def ground_true(t):
    return(K_real/(1+np.exp(-r_real*t-c)))

x=np.arange(0,10,0.1)
y=ground_true(x)

# dN/dt 目标输出
y_diff = (y[1:]-y[:-1])/(x[1:]-x[:-1])

# N_xi 处理后的输入
y_xi = (y[1:]+y[:-1])/2

# 这里不想用n-1,直接以n表示了
n = y_xi.shape[0]

原数据效果就是一开始给的图,而经过处理的数据则是如下效果

import matplotlib.pyplot as plt
plt.plot(x,y)
plt.plot(x[:-1],y_xi)
plt.show()

在这里插入图片描述
定义必要的函数

# 模型
def f(r, K, N):
    return r*N*(1-N/K)
    
# loss函数    
def loss_of_rK(r, K):
    return 1/n*np.sum((y_diff-f(r, K, y_xi))**2)

# ∂L/∂r
def diff_r(r, K):
    return -2.0/n*np.sum((y_diff-f(r, K, y_xi))*y_xi*(1-y_xi/K))

# ∂L/∂K
def diff_K(r, K):
    return -2.0/n*np.sum((y_diff-f(r, K, y_xi))*r*(y_xi**2)/(K**2))

在选择梯度下降法的起点时,尽量靠近最终目标,收敛时间才短。
前面说过,梯度的大小不是我们所关心的内容,所以我加入了一个归一化函数 arctan ⁡ \arctan arctan(归一化函数还有很多,如sigmoid等等)用来取出它的方向,用参数本身的绝对值当做步伐大小。(其实这比较像是强行把L2损失改为L1损失)

#初始化
rx = np.random.rand()
Kx = np.random.rand()*np.max(y_xi)#选接近最大值为初始值比较合理

# 学习率
eta = 1e-1
# 误差精度
epsilon= 1
while (loss_of_rK(rx, Kx) > epsilon):
    rx = rx-eta*np.arctan(diff_r(rx, Kx))*np.abs(rx)
    Kx = Kx-eta*np.arctan(diff_K(rx, Kx))*np.abs(Kx)

迭代了41610步,结果为
在这里插入图片描述
它的拟合轨迹如下,横轴为r,纵轴为K
在这里插入图片描述

需要注意的是,梯度下降法没有办法保证解是最优/解存在/解可达。也没有办法保证收敛。它只是一种凸优化手段。尽管如此,机器学习等学科仍然大量的使用它,俗称炼丹。

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

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

相关文章

Jenkins配置仅合并代码后触发流水线

使用GitLabJenkins集成, 使用Jenkins的Generic WebHook插件;此插件可以作为各个工具间集成使用的通用方式,但是遇到些场景需要写些代码。关于 “合并代码后触发Pipeline”的配置方式, 其实思路简单,实现和让我描述起来…

电脑怎样连接打印机?分享4个简单操作!

为了更方便学习,我买了一个打印机来打印需要用的资料,但是操作了半天还是没连接上,想请问一下有经验的朋友是怎么将打印机与电脑进行连接的呢? 在现代人的工作和生活中,打印机是一个重要的设备。我们可以利用打印机进行…

一文搞懂String、StringBuffer、StringBuilder三者的对比以及扩容机制

String:不可变的字符序列;底层使用char[]存储StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;…

行为型设计模式09-中介者模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 中介者模式 1、中介者模式介绍 中介者模式(Mediator Pattern)是一种行为设计模…

【MySQL数据库】MySQL 高级SQL 语句一

[TOC](MySQL 高级SQL 语句 一、MySQL 高级SQL 语句1.1select -显示表格中一个或数个字段的所有数据记录1.2distinct不显示重复的数据记录1.3where有条件查询1.4and、or且 或1.5in 显示已知的值的数据记录1.6between 显示两个值范围内的数据记录1.7通配符,通常通配符…

都2023年了,JavaScript ES6后的新(lao)特性,你用起来了吗?

前言 JavaScript ES6 指的是 ECMAScript 6,它是 JavaScript 语言第六版的规范。ES6 包含了很多新特性和语法糖,涵盖了从 ES6 开始至今所增加的所有特性。 因此,ES6 新特性是指从 ES6 开始新增到当前时刻所有的新特性,包括但不限…

FPGA XDMA 中断模式实现 PCIE X8 HDMI视频采集 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串…

四肽-21——改善皮肤紧实感、光滑感和弹性

简介 四肽-21是一种来源于皮肤自身的四胜肽,它结构独特、能高效的促进细胞外基质合成,从而减少各种皱纹和改善皮肤衰老现象。与市场上非常受欢迎的基肽(Matrixyl)相比,四肽-21效果更为突出。 Tetrapeptide-21 is a type of tetra…

LeetCode - #85 最大矩形(Top 100)

文章目录 前言1. 描述2. 示例3. 答案题解 1题解 2 关于我们 前言 本题为 LeetCode 前 100 高频题 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者&am…

解密后无法加载到指定模版,且模版名为空

问题如图: 原因:因为改变了项目的集成管理,导致变量丢失

Redis原理 - 五种数据类型的底层结构关系

原文首更地址,阅读效果更佳! Redis原理 - 五种数据类型的底层结构关系 | CoderMast编程桅杆https://www.codermast.com/database/redis/base-datatype-implement.html #字符串对象String String 是 Redis 中最常见的数据存储类型。 其基本编码方式是 …

安卓蓝牙SDP协议数据包

1. SDP概念 我们想一想,两个陌生的设备(之前未有过交互)如何去发现对方支持什么服务呢?比如Host端的Controller怎么知道远程蓝牙设备是蓝牙耳机还是HID遥控器呢?我们需要一种协议,这种协议在蓝牙设备配对成…

Git-Desktop【使用说明】

仓库操作 简单的创建仓库、删除仓库 删除点击 Remove 即可 文件操作 1、提交文件到本地仓库 2、修改文件 Git没有修改文件这一说,它只会再次提交一个新的版本到仓库中,提交修改后的文件其实是在仓库创建了一个新的文件,只不过是一个不同的…

Optano.Modeling 简单教程

前言 在工作中遇到两个需求,将两个数学公式用 .NET 的数学库找到数学公式中某个未知数的最优解,我尝试了几个数学库都没有办法完美解决我的需求,直到找到 Optano.Modeling Optano.Modeling 官网:Optano.Modeling 官网 Optano.Mo…

AI操作视频的工具最新最强集合

AI的进化日新月异,很多之前只是在想象中的操作,已经有很多可以使用AI来完成了。最新的Stable Diffusion,ControlNet,EBsynth有哪些神奇的应用,如何一键替换视频中人物和场景,如何根据文字描述即可生成梦幻视频?我们整理…

DFS/回溯/动态规划算法的融会贯通

学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章👇 在线学习网站: https://labuladong.gitee.io/algo/ 经常有读者后台问我,DFS算法/回溯算法/动态规划算法之间的区别和联系是什么? 对于这个问题,我…

私有化部署的无忧·企业文档2.1.7新版本核心功能介绍

无忧企业文档是一款针对企业用户提供在线文档、协同编辑、知识管理的基础化办公工具,产品采用B/S构架。功能覆盖场景包括:在线文档的私有化部署、团队协同、知识管理、在线文档识别的扩展、文档权限化管理等等场景。本次2.1.7版本更新了以下几个核心功能…

【机器学习】十大算法之一 “线性回归”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

什么是事件委托

文章目录 导文文章重点具体而言,事件委托包含两个主要角色:通过使用事件委托,可以实现以下优势: 代码示例 导文 事件委托是一种在软件开发中常用的设计模式,用于处理事件和回调函数。它允许一个对象(委托对…

数据帧转发过程中IP地址及MAC地址的变化

数据帧在交换机间转发 帧经过交换机时,其源、目标MAC是不会变的。 交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不…