python最小二乘法_python中的最小二乘法?

这个答案提供了使用Python来确定一般指数模式的拟合参数的详细介绍。

数据清理

首先,让我们以numpy数组的形式输入和组织采样数据,这将有助于计算和清晰度。import matplotlib.pyplot as plt

import scipy.optimize as opt

import numpy as np

#% matplotlib inline

# DATA ------------------------------------------------------------------------

T_values = np.array([222, 284, 308.5, 333, 358, 411, 477, 518, 880, 1080, 1259])

C_values = np.array([0.1282, 0.2308, 0.2650, 0.3120 , 0.3547, 0.4530, 0.5556, 0.6154, 0.8932, 0.9103, 0.9316])

x_samp = T_values

y_samp = C_values

在scipy和numpy中有许多curve fitting函数,每个函数的用法都不同,例如^{}和^{}。为了简单起见,我们将使用^{},但是如果不选择合理的开始参数,很难找到一个优化的回归曲线。稍后将演示一种选择起动参数的简单方法。

回顾

首先,虽然OP提供了一个预期的拟合方程,但我们将通过查看指数函数的一般方程来解决使用Python进行曲线拟合的问题:

现在我们构建这个通用函数,它将被使用几次:# GENERAL EQUATION ------------------------------------------------------------

def func(x, A, c, d):

return A*np.exp(c*x) + d

趋势振幅:一个小的A给出一个小的振幅

shape:一个小的c通过压平曲线的“膝盖”来控制形状

位置:d设置y截距

方向:负A翻转曲线穿过水平轴;负c翻转曲线穿过垂直轴

后一种趋势如下图所示,与具有不同参数的线(红线)相比,突出显示控件(黑线):

选择初始参数

利用后一种趋势,让我们接下来看看数据,并尝试通过调整这些参数来模拟曲线。为了演示,我们根据我们的数据绘制了几个试验方程:# SURVEY ----------------------------------------------------------------------

# Plotting Sampling Data

plt.plot(x_samp, y_samp, "ko", label="Data")

x_lin = np.linspace(0, x_samp.max(), 50) # a number line, 50 evenly spaced digits between 0 and max

# Trials

A, c, d = -1, -1e-2, 1

y_trial1 = func(x_lin, A, c, d)

y_trial2 = func(x_lin, -1, -1e-3, 1)

y_trial3 = func(x_lin, -1, -3e-3, 1)

plt.plot(x_lin, y_trial1, "--", label="Trial 1")

plt.plot(x_lin, y_trial2, "--", label="Trial 2")

plt.plot(x_lin, y_trial3, "--", label="Trial 3")

plt.legend()

通过简单的试错,可以较好地逼近曲线的形状、幅度、位置和方向。例如,我们知道前两个参数(A和c)必须为负。我们对c的数量级也有一个合理的猜测。

计算估计参数

我们现在将使用最佳试验的参数进行初步猜测:# REGRESSION ------------------------------------------------------------------

p0 = [-1, -3e-3, 1] # guessed params

w, _ = opt.curve_fit(func, x_samp, y_samp, p0=p0)

print("Estimated Parameters", w)

# Model

y_model = func(x_lin, *w)

# PLOT ------------------------------------------------------------------------

# Visualize data and fitted curves

plt.plot(x_samp, y_samp, "ko", label="Data")

plt.plot(x_lin, y_model, "k--", label="Fit")

plt.title("Least squares regression")

plt.legend(loc="upper left")

# Estimated Parameters [-1.66301087 -0.0026884 1.00995394]

这是怎么工作的?

curve_fit是scipy提供的众多optimization functions之一。给定一个初始值,对得到的估计参数进行迭代细化,使得到的曲线将残差或拟合线与采样数据之间的差异最小化。更好的猜测可以减少迭代次数并加快结果。利用拟合曲线的这些估计参数,现在可以计算特定方程的特定系数(最后一个练习留给OP)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值