首页 > 解决方案 > 平滑拟合函数

问题描述

大家下午好,

我一直在尝试平滑作为指数拟合过程输出的拟合函数。我正在使用的代码行如下所示:

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

x = (0.005, 0.025, 0.05, 0.075, 0.1)
y = (1.0, 0.7261356155365372, 0.5170068027210885, 0.3651525126179504, 0.26135615536537193)
plt.plot(x, y, "r")
x = np.array(x, dtype=float)
y = np.array(y, dtype=float)
def func(x, a, b):
    return a * np.exp(-b * x)
popt, pcov = curve_fit(func, x, y)
print(popt[0], popt[1])

plt.plot(x, func(x, *popt), "b")
plt.legend(loc='best')
plt.show()

我的图形输出

输出在数学上令人满意,我的拟合值print(popt[0], popt[1])非常合理。主要问题是蓝线(拟合函数)不平滑。我一直在谷歌上搜索函数平滑,但我没有发现任何适用于拟合函数的函数,而那些作用于我的原始数据集的函数,例如 numpy's np.linspace(),并没有帮助。

非常感谢任何可以帮助我完成这项任务的人!

标签: pythonnumpyscipy

解决方案


所以,这个函数绝对是平滑的,因为它是一个很好的指数。问题是您将它绘制在一个非常粗糙的网格上x。当然,您希望x在拟合曲线时保持固定,因为这些值x对应于您已知的观察值y。但是我们可以在绘图时使用不同的域,如下所示。

替换以下开头的行plt.plot

new_x = np.linspace(0, 0.1) # or whatever domain you like
plt.plot(new_x, func(new_x, *popt), "b")
plt.legend(loc='best')
plt.show()

你应该很好。


推荐阅读