机器学习中的指数回归的温和介绍

136 阅读6分钟

在现实世界的应用中,建模的目标通常是在数学模型中以最佳的概括性来表示随时间变化的自然现象的行为。各种模型已经被开发出来,并被证明可以很好地捕捉这些行为。有各种模型用于模拟不同的问题。

线性回归是建模中广为人知的模型,因为它的简单性和在初级阶段的使用能力。然而,几乎所有现实世界的问题都是非线性的。因此,线性回归在重大问题上的应用仍然有限。

然而,这并不意味着线性回归是不重要的。相反,由于其计算成本比非线性模型便宜,大多数非线性模型通常被转换到线性空间,在那里我们对其未知参数进行近似,然后再映射到原始空间。

一个可能的情况是,在快速增长或快速衰减的情况下,可能需要一个不同于线性回归的模型。

在这种情况下,过程往往会经历翻倍时间,即一个数量翻倍所需的时间。在现实生活中,翻倍时间可以在金融投资、野生动物种群、自然资源和生物样本等领域得到见证。

因此,指数函数可以成为模拟这些过程的适当模型。

在这篇文章中,我们将学习如何表示指数假设,如何近似其参数,使用Python拟合曲线,最后使用Python中返回的参数说明我们的模型。

最后,使用我们陈述的模型,我们将预测一些未来的数值。

前提条件

  • 本节需要对优化方法有良好的了解,特别是Bisection方法
  • 对Python函数的良好理解。

指数函数简介

正如我们之前所说,指数是用来解释自然行为的模型,即系统经历了一个翻倍的增长率。这个模型的形式是。

1.,,,y = A_0e^{bt}$。

或。

2.,,y = A_0e^{-bt}$ 其中。

  • t是任何一个时间点。
  • y是函数在任何时间t的值。
  • A_0A\_0t=0t=0时的模型值,目标是
  • ee是欧拉常数,通常为2.71828...,。
  • b是决定变化率的常数

第一个模型,即(1)(1),为随时间增长的过程建模。因此,它是一个快速增长的模型。第二种情况,即(2)(2),模拟随时间推移的快速衰减过程。这个模型应用的一个很好的例子是放射性衰变模型。

现在,假设我们给出(x_1,y_1),,(x_2,y_2),...,,,(x_n,y_n)(x\_1,y\_1),,(x\_2,y\_2),...,,,(x\_n,y\_n),我们要对数据进行拟合,y=ebxy=e^{bx},

常数aabb是该模型的未知参数。因此,它们必须被估计。但是,首先,我们需要定义一个损失函数来估计这些参数。

损失函数只是预测值与观察值的偏差。因此,我们首先获得每个数据点的残差,如下所示。

E_i=y_iaebx_iE\_i=y\_i-ae^{bx\_i}

然后,我们将所有训练集例子的残差相加。这就给我们提供了平方残差之和(SSR),如下所示。

S_i=sum_i=1n(y_iaebx_i)2=sum_i=1nE_iS\_i=sum\_{i=1}^{n} (y\_i-ae^{bx\_i})^2 = sum\_{i=1}^{n}。E\_i

其中n是训练集中的实例数。

为了近似常数a和b,我们通过对a,b进行微分,使上述损失函数,即SSR最小化,并将所得方程等效为零。

我们按以下方式进行。

  • 将误差函数与aa进行微分。

largefracdeltaSdeltaa=sum_n=1n2(y_iaebx_i)(ebx_i)=0large {\\frac{delta S}{delta a}= sum\_{n=1}^{n} 2(y\_i-ae^{bx\_i}) (-e^{bx\_i})=0}

  • bb的误差函数进行微分。

largefracdeltaSdeltab=sum_n=1n2(y_iaebx_i)(ax_iebx_i)=0large{\\frac{delta S}{delta b}= sum\_{n=1}^{n} 2(y\_i-ae^{bx\_i})(-ax\_ie^{bx\_i}) =0}

这些方程可以表示为。

largefracdeltaSdeltaa=sˋum_n=1ny_iebx_i.+asum_n=1ne2bx_i=0....(1.0)large\\frac{delta S}{delta a}= \`sum\_{n=1}^{n} y\_ie^{bx\_i}.+ a sum\_{n=1}^{n} e^{2bx\_i}=0; \\ .\\ .\\ .\\ .\\ (1.0)

largefracdeltaSdeltab=sum_n=1ny_ix_iebx_iasum_n=1nx_ie2bx_i=0;....(1.1)large\\frac{delta S}{delta b}= sum\_{n=1}^{n} y\_ix\_ie^{bx\_i} - a sum\_{n=1}^{n} x\_ie^{2bx\_i}=0; \\ .\\ .\\ .\\ .\\ (1.1)

方程1.01.1和1.1aabb中是非线性的,因此不能像线性回归那样以封闭形式求解。

一般来说,可以采用迭代方法,如高斯牛顿迭代法最陡峭下降法直接搜索法等来确定aabb的值。

注意,从方程1.0中,中,a可以用可以用b$来表示,即。

{大a= frac{sum\_{i=1}^{n} y\_ie^bx\_i}{sum\_{i=1}{n} e^{2bx\_i}};,,,,(1.2)

将方程1.2代入1.1代入1.1可以得到。

LargefracdeltaSdeltab=sum_n=1ny_ix_iebx_ifracsum_i=1ny_iebx_isum_i=1ne2bx_isum_n=1nx_ie2bx_i=0;....5(b)Large\\frac{delta S}{delta b}= \\sum\_{n=1}^{n} y\_ix\_ie^{bx\_i} - {frac{sum\_{i=1}^{n} y\_ie^bx\_i}{sum\_{i=1}{n} e^{2bx\_i}}}\\sum\_{n=1}^{n} x\_ie^{2bx\_i}=0; \\.\\ .\\ .\\ .\\ 5(b)

我们可以看到,这个方程在bb中仍然是非线性的。然而,使用二分法,我们可以确定bb

为了清楚地了解,让我们考虑一个例子,看看我们如何将上述公式付诸实践。

问题。

当一项检查涉及注射放射性物质时,许多病人会感到担心。例如,几滴Technetium-99m同位素被用于扫描胆囊。一半的锝-99m会在大约6小时内消失。然而,辐射水平需要大约24小时才能达到我们在日常活动中所暴露的程度。下面给出的是辐射的相对强度与时间的关系。

data-set

辐射的相对强度水平通过一个指数函数γ=Aelambdatγ = Ae^{lambda t}与时间相关。我们被要求找到

a) 该模型的参数,即A和λ,b) 24小时后的辐射强度。

让我们先用手解决这个问题,然后再实现这个模型。

Largegamma=AelambdatLarge\\gamma=Ae^{\\lambda t}

$$lambda$的值是通过解决以下非线性方程而得到的。

{Large {f(lambda) = \\sum\_{n=1}^{n}}.\\gamma\_i t\_ie^{\\lambda t\_i} - 夫拉克{sum\_{i=1}^{n}\\gamma\_i e^{lambda t\_i}{sum\_{i=1}^{n} e^{2 lambda t\_i}}。\\sum\_{i=1}^{n} t\_ie^{2\\lambda t\_i}=0}$$。\\ .\\ (8) 然后我们对A进行评估,即。

LargeA=fracsum_i=1n.gamma_ielambdat_isum_i=1ne2lambdat_iLarge A= frac{sum\_{i=1}^{n}.\\gamma\_ie^{lambda t\_i}}{sum\_{i=1}{n}e^{2 lambda t\_i}}

使用二分法,让我们尝试解决lambdalambda的方程88

我们首先估计我们的初始猜测为。

lambda=0.120lambda=-0.120, 和

$$lambda=-0.110$

首先我们需要检查这些猜测是否与我们的方程根在其区间内,即flambdatimesf(-\\lambda)\\timesf(\lambda)<0$。

lambda=0.120\\lambda=-0.120时,我们对f(0.120)f(-0.120)的评估如表所示

table-of-valiues

从这个表中,f(0.120)=(6.2501)frac2.90622.8763(6.0954)=0.091357f(-0.120)=(6.2501)-\\frac{2.9062}{2.8763}(6.0954)=0.091357

同样,我们可以计算出f(0.110)=0.10099f(- 0.110)=-0.10099

f(\lambda)\lambda=-0.120\lambda=-0.110之间改变了符号,因此根存在于之间改变了符号,因此根存在于[-0.110,-0.120]区间。继续使用二分法,我们在20次迭代后,区间。继续使用二分法,我们在20次迭代后,f(\lambda)=0的值为的值为\lambda = -0.11508。这个解决方案的精度小于0.000008。这个解决方案的精度小于0.000008%的绝对相对误差。

使用方程1.2,我们可以计算出,我们可以计算出a$的值,如下所示。

Large{ a= frac{sum\_{i=1}^{n}.\\gamma\_ie^bt\_i}{sum\_{i=1}^{n}e^{2bt\_i}};,,,,,(1.2)

value-a

=Largefrac2.93732.9378= \\Large\\frac{2.9373}{2.9378}

=0.99983= 0.99983

由于我们有这两个未知参数的值,我们可以把我们的模型陈述如下。

gamma=0.99983e0.11508tgamma = 0.99983e^{-0.11508t}

现在,让我们看看我们如何在Python中实现这个模型。

指数模型的Python实现

为了实现这个模型,首先,我们需要导入所需的库。在这个环节,我们需要以下库。

  1. 用于处理数据数组的Numpy。
  2. Maltplotilib用于数据可视化

让我们导入这些库。

import numpy as np
import matplotlib.pyplot as plt

接下来,让我们创建我们的数据集。

# create the dataset
t = np.array([0,1,3,5,7,9])
y = np.array([1.000,0.891,0.708,0.562,0.447,0.355])

我们可以通过绘制数据的散点图来看到我们的变量之间的下划线关系。

#plotting the data
plt.scatter(t, y, color="green")
plt.title("Scatter Plot")
plt.show()

scatter plot

从上面的散点图中我们可以看到,数据描述了一种逐渐衰减的关系。因此,指数模型是拟合该数据集曲线的最佳模型。现在,让我们来拟合我们的模型。

#fit the model
the model for our data is:
y = A*exp{λt};
Taking the log on both sides of y, we get
log(y) = log(A) + λt

So to fit our model, we first take the natural log on only the y variable and not t.

model = np.polyfit(t, np.log(y), 1) # the argument 1 idicates the degree of the polynomial
# view the model's output
print(model)

输出

[-0.11504963 -0.0002615 ]

上述模型输出的第一个元素是对应于解释变量t的系数,即λ,第二个元素对应于t=0t=0时的拟合模型的值,即log(A)。

为了得到最适合给定数据的模型,我们通过对数据进行反变换来变换拟合模型。使用返回的系数,我们建立的模型如下。

logy=log0.115049630.0002615tlog(y)=log(-0.11504963)-0.0002615t

在两边取指数,我们得到。

y=exp(0.0002615)e0.11504963ty = exp{(-0.0002615)}e^{-0.11504963t}

简化这一点,我们得到的最终模型为。

y=0.99974e0.11504963ty = 0.99974e^{-0.11504963t}

现在,假设我们想计算24小时后的相对辐射强度。要做到这一点,我们在模型中插入t=24t=24,得到的结果是,即

y=0.99974e0.11504963(24)=6.320times102y = 0.99974e^{-0.11504963(24)}=6.320\\times 10^{-2}

由于在t=0,,,,y=0.99974t=0,,,,y=0.99974,使用上述输出,我们可以计算出24小时后剩余放射性强度的百分比,如下所示。

frac6.320times1020.99974times100frac{6.320\\times 10^{-2}}{0.99974}\\times 100 %=6.3216%

因此,24小时后,初始放射性强度将只剩下6.3216%$。这就是我们如何使用指数模型来进行预测的。

最后,我们可以将我们的模型可视化。

# Visualize the model
myplot = plt.plot(t,y)
myplot

输出

exponential model

正如我们所看到的,我们的模型在两个变量之间显示出一种类似于曲率的递减关系。

总结

在这篇文章中,我们介绍了指数模型。我们首先定义了指数模型并概述了它的两种类型。然后我们看了它的假设表示,从中得出了损失函数。

为了近似模型的未知常数,我们通过寻找最小化误差函数的未知值来解决松散函数。

涵盖这些之后,我们又看了一个案例,我们能够将我们对模型的理论理解带入实践。最后,我们用python实现了我们的模型,并利用它进行了预测。