python - 平滑拟合函数
问题描述
大家下午好,
我一直在尝试平滑作为指数拟合过程输出的拟合函数。我正在使用的代码行如下所示:
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()
,并没有帮助。
非常感谢任何可以帮助我完成这项任务的人!
解决方案
所以,这个函数绝对是平滑的,因为它是一个很好的指数。问题是您将它绘制在一个非常粗糙的网格上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()
你应该很好。
推荐阅读
- node.js - 为什么有些用户在 AWS ElasticBeanstalk 中部署后没有体验到更新?
- ansible - 如何使用 Ansible 获取 IP 地址?
- javascript - 函数“输入”和另一个允许“找到最大数字”的函数
- tensorflow - 将 ResNeXt 导入 Keras
- css - 仅当其同级具有无效类时,如何在 ::after 之后使用类
- python - Keras CNN,高训练低测试
- prometheus - Prometheus Windows 事件日志指标
- swift - LIBDISPATCH 客户端中的调度组崩溃错误:对 dispatch_group_enter() 的嵌套调用过多
- java - Maven用不同版本的依赖构建2个版本的war
- javascript - “CYPRESS_INCLUDE_TAGS=wip npx cypress run”命令的赛普拉斯标签问题