标准适合产生不正确的拟合

时间:2017-03-15 09:57:27

标签: python matplotlib scipy

为什么以下产生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

感谢。

2 个答案:

答案 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