SciPy 一维高斯拟合
SciPy 1D Gaussian fit
可能已经发布了类似的内容,但我无法将高斯拟合到我的数据中。它只产生一条直线水平线。我用一些随机生成的数据尝试了代码并且它有效。我不确定为什么它不适用于实际数据。我希望有人能够帮助我解决这个问题。谢谢。
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()
拟合效果非常好 - 我得到 mu == 646.6
和 std = 207.07
,它们正好等于 y
值的平均值和标准差。
我认为您只是对自己的计划感到困惑。 norm.pdf
评估高斯分布的 probability density function。 PDF 总是积分为 1,而 y
中的实际值大约为 370-1000。此外,由于 xp
介于 0 和 17 之间,您正在评估 PDF 的 y 值范围低于平均值约 3 个标准偏差,因此您得到的概率密度将非常接近于零.如果您将这些值绘制在与 y
相同的轴上,那么这条线当然会看起来很平,因为您的 y 轴的比例太大了。
根据您指定 x
值的事实,我猜您只想将高斯函数拟合到关系 f(x) = y
,而不是估计 [=] 上的概率分布12=] 值。在这种情况下,您应该使用 scipy.optimize
中的函数 - 有关使用 scipy.optimize.curve_fit
.
的示例,请参见 this answer
可能已经发布了类似的内容,但我无法将高斯拟合到我的数据中。它只产生一条直线水平线。我用一些随机生成的数据尝试了代码并且它有效。我不确定为什么它不适用于实际数据。我希望有人能够帮助我解决这个问题。谢谢。
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()
拟合效果非常好 - 我得到 mu == 646.6
和 std = 207.07
,它们正好等于 y
值的平均值和标准差。
我认为您只是对自己的计划感到困惑。 norm.pdf
评估高斯分布的 probability density function。 PDF 总是积分为 1,而 y
中的实际值大约为 370-1000。此外,由于 xp
介于 0 和 17 之间,您正在评估 PDF 的 y 值范围低于平均值约 3 个标准偏差,因此您得到的概率密度将非常接近于零.如果您将这些值绘制在与 y
相同的轴上,那么这条线当然会看起来很平,因为您的 y 轴的比例太大了。
根据您指定 x
值的事实,我猜您只想将高斯函数拟合到关系 f(x) = y
,而不是估计 [=] 上的概率分布12=] 值。在这种情况下,您应该使用 scipy.optimize
中的函数 - 有关使用 scipy.optimize.curve_fit
.