有没有一种方法可以在没有函数的情况下绘制最佳拟合曲线?Python

9
我需要绘制一条平滑的最佳拟合曲线,但我找到的所有方法都使用scipy.optimize.curve_fit(),而这需要知道将x和y关联起来的函数。是否有更简单的方法适用于基本散点图?
我尝试获取曲线的内容:
import matplotlib.pyplot as plot

x = range(30)
y = [1, 1, 1, 2, 1, 1, 1, 2, 4, 5, 8, 12, 13, 14, 12, 11, 9, 6, 5, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1 ]

plot.plot(x, y, "o")
plot.show()

非常感谢您的帮助。


“the curve” 是指在不知道函数的情况下,你所说的曲线是什么意思?你的数据看起来相当符合高斯分布——你是否正在寻找一个高斯拟合来处理这些数据? - Tom
是的,但我不需要知道将x与y相关联的具体高斯函数才能得到准确的曲线吗? - harpreet bains
1个回答

10
通常,人们在没有生成函数的情况下使用样条曲线进行平滑处理。以下是使用您的数据的示例:enter image description here
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
import numpy as np

x = range(30)
y = [1, 1, 1, 2, 1, 1, 1, 2, 4, 5, 8, 12, 13, 14, 12, 11, 9, 6, 5, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1 ]

s = UnivariateSpline(x, y, s=5)
xs = np.linspace(0, 29, 100)
ys = s(xs)

plt.plot(x, y, 'o')
plt.plot(xs, ys)
plt.show()

你可能已经猜到了,关键字s用于设置拟合与数据的匹配程度,其中s=0将穿过每个点。

样条基本上是将简单函数拟合到曲线的局部点集上,然后在边界处匹配导数以连接这些局部曲线,使最终结果看起来平滑。

在scipy中有多种样条例程可供选择。


好的。从您主要问题的评论中,似乎您可能更喜欢拟合高斯分布,这也是可能的,但与此解决方案非常不同。请澄清是否确实需要进行完整拟合。 - tom10
对于我的数据来说,UnivariateSpline 的输入必须严格递增,这让我有点烦恼。在我的情况下,我会在传递给 UnivariateSpline 之前对给定的 x 值进行 y 值平均处理,但是如果有一个单一的函数可以自动处理这个问题就太好了。 - abcd
这些信息对我帮助很大!对于将来的用户,你应该知道默认情况下拟合是立方的——这并不总是你想要的——传递参数"k"来控制拟合的顺序是非常重要的。非常重要... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接