为什么以下产生muf和stdf的错误输出?
import numpy as np
from scipy.stats import norm
x=np.linspace(-50,50,100)
sig=10
mu=0
y=1/np.sqrt(2*sig*sig*np.pi)*np.exp(-(x-mu)*(x-mu)/(2*sig*sig))
muf, stdf = norm.fit(y)
print muf,stdf
这打印
0.00989999568634 0.0134634293279
感谢。
答案 0 :(得分:2)
documentation of scipy.stats.norm
代表其fit
函数
fit(data, loc=0, scale=1)
通用数据的参数估计值。
对我而言,这是非常不可理解的,而且我很确定人们不能指望这个功能能够恢复正常意义上的契合。
然而,要适应高斯是相当直接的:
from __future__ import division
import numpy as np
x=np.linspace(-50,50,100)
sig=10
mu=0
y=1/np.sqrt(2*sig*sig*np.pi)*np.exp(-(x-mu)*(x-mu)/(2*sig*sig)) #
def gaussian_fit(xdata,ydata):
mu = np.sum(xdata*ydata)/np.sum(ydata)
sigma = np.sqrt(np.abs(np.sum((xdata-mu)**2*ydata)/np.sum(ydata)))
return mu, sigma
print gaussian_fit(x,y)
这打印
(-7.474196315587989e-16, 9.9999422983567516)
足够接近(0, 10)
的预期值。
答案 1 :(得分:2)
你误解了norm.fit
的目的。它不适合曲线的高斯曲线,但符合数据的正态分布:
np.random.seed(42)
y = np.random.randn(10000) * sig + mu
muf, stdf = norm.fit(y)
print(muf, stdf)
# -0.0213598336843 10.0341220613
您可以使用curve_fit
将正态分布的参数与给定曲线相匹配,因为最初在问题中尝试过:
import numpy as np
from scipy.stats import norm
from scipy.optimize import curve_fit
x=np.linspace(-50,50,100)
sig=10
mu=0
y=1/np.sqrt(2*sig*sig*np.pi)*np.exp(-(x-mu)*(x-mu)/(2*sig*sig))
(muf, stdf), covf = curve_fit(norm.pdf, x, y, p0=[0, 1])
print(muf, stdf)
# 2.4842347485e-08 10.0000000004