SciPy 1D高斯拟合

时间:2015-03-10 22:20:14

标签: python numpy scipy gaussian

可能已经发布了类似的内容,但我无法将Gaussian与我的数据相匹配。它只产生一条直线水平线。我用一些随机生成的数据尝试了代码并且它可以工作。我不确定为什么它不适用于实际数据。我希望有人能够帮助我。谢谢。

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

# Data
y = np.array([395.27, 399.77, 436.10, 486.60, 561.20, 636.37, 784.90, 917.50, 965.53, 910.87, 897.67, 868.17, 762.93, 647.33, 519.37, 426.73, 375.87])
x = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])

# Find mean and sd
mu, std = norm.fit(y)

# plot original data
plt.scatter(x,y)

# plot Gaussian Fit
xp = np.linspace(0, len(x), 100)
p = norm.pdf(xp, mu, std)
plt.plot(xp, p, linewidth=2)
title = "Fit results: mu = %.2f,  std = %.2f" % (mu, std)
plt.title(title)

plt.show()

1 个答案:

答案 0 :(得分:3)

拟合实际上非常有效 - 我得到mu == 646.6std = 207.07,它们与y值的平均值和标准差完全相等。

我认为你只是对你正在策划的内容感到困惑。 norm.pdf评估高斯分布的probability density function。 PDF始终集成为1,而y中的实际值大约为370-1000。此外,由于xp介于0和17之间,因此您在一系列y值上评估PDF,这些y值比平均值低约3个标准偏差,因此您获得的概率密度将非常接近于零。如果您在与y相同的轴上绘制这些值,那么当然这条线看起来会很平坦,因为y轴的比例太大了。

基于您指定x值的事实,我猜您只想将高斯函数拟合到f(x) = y关系,而不是估计y上的概率分布。 }值。在这种情况下,您应该使用scipy.optimize中的函数 - 请参阅this answer以获取使用scipy.optimize.curve_fit的示例。