gpt4 book ai didi

numpy - numpy和scipy中的指数衰减曲线拟合

转载 作者:行者123 更新时间:2023-12-04 15:13:16 28 4
gpt4 key购买 nike

我在为某些数据拟合曲线时遇到了一些麻烦,但无法弄清楚我哪里出错了。

过去我曾用 做过这件事numpy.linalg.lstsq 对于指数函数和 scipy.optimize.curve_fit 对于 sigmoid 函数。这次我希望创建一个脚本,让我可以指定各种函数、确定参数并测试它们与数据的匹配度。这样做时,我注意到 Scipy leastsq和 Numpy lstsq似乎为同一组数据和同一功能提供了不同的答案。功能很简单 y = e^(l*x)并且受到约束,使得 y=1x=0 .

Excel 趋势线与 Numpy lstsq 一致结果,但作为 Scipy leastsq能够采取任何功能,最好找出问题所在。

import scipy.optimize as optimize
import numpy as np
import matplotlib.pyplot as plt

## Sampled data
x = np.array([0, 14, 37, 975, 2013, 2095, 2147])
y = np.array([1.0, 0.764317544, 0.647136491, 0.070803763, 0.003630962, 0.001485394, 0.000495131])

# function
fp = lambda p, x: np.exp(p*x)

# error function
e = lambda p, x, y: (fp(p, x) - y)

# using scipy least squares
l1, s = optimize.leastsq(e, -0.004, args=(x,y))
print l1
# [-0.0132281]


# using numpy least squares
l2 = np.linalg.lstsq(np.vstack([x, np.zeros(len(x))]).T,np.log(y))[0][0]
print l2
# -0.00313461628963 (same answer as Excel trend line)

# smooth x for plotting
x_ = np.arange(0, x[-1], 0.2)

plt.figure()
plt.plot(x, y, 'rx', x_, fp(l1, x_), 'b-', x_, fp(l2, x_), 'g-')
plt.show()

编辑 - 附加信息

上面的 MWE 包括数据集的一个小样本。拟合实际数据时 scipy.optimize.curve_fit 曲线呈现的 R^2 为 0.82,而 numpy.linalg.lstsq 曲线与 Excel 计算的相同,其 R^2 为 0.41。

最佳答案

您正在最小化不同的误差函数。

当您使用 numpy.linalg.lstsq ,最小化的误差函数为

np.sum((np.log(y) - p * x)**2)

scipy.optimize.leastsq最小化函数
np.sum((y - np.exp(p * x))**2)

第一种情况需要因变量和自变量之间存在线性依赖关系,但解决方案是分析已知的,而第二种情况可以处理任何依赖关系,但依赖于迭代方法。

另外,我现在无法测试它,但是在使用 numpy.linalg.lstsq 时,我你不需要 vstack一行零,以下也有效:
l2 = np.linalg.lstsq(x[:, None], np.log(y))[0][0]

关于numpy - numpy和scipy中的指数衰减曲线拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14349771/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com