首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用curve_fit在python中显示标准错误?

如何用curve_fit在python中显示标准错误?
EN

Stack Overflow用户
提问于 2022-03-09 22:43:17
回答 1查看 654关注 0票数 2

我试图将多个曲线方程与我的数据进行拟合,以确定哪种衰变曲线最能代表我的数据。我在python中使用curve_fit函数在scipy中。

下面是我的示例数据:

代码语言:javascript
复制
data = {'X':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12 ,13 ,14 ,15
],
        'Y':[55, 55, 55, 54, 54, 54, 54, 53, 53, 50, 45, 37, 27, 16, 0
]}
df = pd.DataFrame(data)

然后,我想尝试拟合一个线性,对数,二次多项式和指数衰减曲线到我的数据点,然后绘制。我正在试验以下代码:

代码语言:javascript
复制
import pandas as pd
import numpy as np
from numpy import array, exp
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# load the dataset
data = df.values
# choose the input and output variables
x, y = data[:, 0], data[:, 1]

def func1(x, a, b):
    return a * x + b

def func2(x, a, b):
    return a * np.log(x) + b

def func3(x, a, b, c):
    return a*x**2+b*x+c

def func4(x, a, b, c):
    return a*exp(b*x)+c

params, covs = curve_fit(func1, x, y)

params, _ = curve_fit(func1, x, y)
a, b = params[0], params[1]
yfit1 = a * x + b
print('Linear decay fit:')
print('y = %.5f * x + %.5f' % (a, b))

params, _  = curve_fit(func2, x, y)
a, b = params[0], params[1]
yfit2 = a * np.log(x) + b
print('Logarithmic decay fit:')
print('y = %.5f * ln(x)+ %.5f' % (a, b))

params, _ = curve_fit(func3, x, y)
a, b, c = params[0], params[1], params[2]
yfit3 = a*x**2+b*x+c
print('Polynomial decay fit:')
print('y = %.5f * x^2 + %.5f * x + %.5f' % (a, b, c))

params, _  = curve_fit(func4, x, y)
a, b, c = params[0], params[1], params[2]
yfit4 = a*exp(x*b)+c
print('Exponential decay fit:')
print('y = %.5f * exp(x*%.5f)+%.5f' % (a, b, c))

plt.plot(x, y, 'bo', label="y-original")
plt.plot(x, yfit1, label="y=a * x + b")
plt.plot(x, yfit2, label="y=a * np.log(x) + b")
plt.plot(x, yfit3, label="y=a*x^2 + bx + c")
plt.plot(x, yfit4, label="y=a*exp(x*b)+c")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best', fancybox=True, shadow=True)
plt.grid(True)
plt.show()

这将产生以下文本和可视绘图输出:

我最初试图找到一种方法来显示每条曲线拟合的r平方值,但我发现对于非线性曲线,R平方是不合适的,相反,我应该识别每条曲线的标准误差,以便最好地判断哪一条曲线方程最能描述我在数据点中看到的衰减。我的问题是,如何将我的代码和我所尝试的每个方程的拟合,并输出一个标准的错误读数,为每个曲线拟合,以便我可以最好地判断哪个方程最准确地表示我的数据?我最终试图做出这样的判断:“我发现当x轴值增加时,y轴值就会衰减.”然后用“线性”、“对数”、“二次二次”或“指数”来拟合这个空白。从视觉上看,我看到指数衰减方程最适合我的数据,但我没有一个定量的基础来进行这个调用,除了视觉上的原因,这就是为什么我试图找出我如何打印标准误差,这样我就可以判断出一个方程的最合适的对应方程,具有最低的标准误差。我一直无法找到如何从我的计算文件中得出这个结果。

EN

回答 1

Stack Overflow用户

发布于 2022-03-14 12:23:08

您可以使用平均绝对比例误差(马塞)来比较拟合的优度。定义MASE的函数如下:

代码语言:javascript
复制
import numpy as np

def mase(actual : np.ndarray, predicted : np.ndarray):

    forecast_error = np.mean(np.abs(actual - predicted))
    naive_forecast = np.mean(np.abs(np.diff(actual)))
    mase = forecast_error / naive_forecast

    return mase

然后简单地将所有预测值与实际值进行比较(都必须是NumPy数组才能使用上面的函数)。然后,您可以选择MASE值最低的模型/方程。例如:

代码语言:javascript
复制
>>> actual = np.array([1,2,3])
>>> predicted1 = np.array([1.1, 2.2, 3.3])
>>> mase(actual, predicted1)
0.20000000000000004
>>>
>>> predicted2 = np.array([1.1, 2.1, 3.1])
>>> mase(actual, predicted2)
0.10000000000000009

在这里,我们可以安全地说,predicted2有一个较低的MASE值,因此是有利的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71416839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档