2016-04-01 4 views
2

データに累積ガウス分布を近似しようとしていますが、フィットは明らかに間違っています。なぜ私は間違った手段と標準偏差を得ていますか?下に私のコードと出力があります。累積ガウスフィットの正しいパラメータをどのように見積もりますか?

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

testrefratios=np.array([ 0.2, 0.4, 0.6, 0.8, 0.9, 1. , 1.1, 1.2, 1.4, 1.6, 1.8]) 
Pn_final=np.array([ 0. , 0. , 0.03 , 0.35 , 0.47, 0.57 , 0.68, 0.73, 0.76 , 0.85 , 0.91]) 
Pd_final=np.array([ 0. , 0.03, 0.36 , 0.85 , 0.97, 0.98 , 0.98 , 0.99 , 1., 1., 1. ]) 

# cumulative gaussian fit 
fg = plt.figure(1); fg.clf() 
ax = fg.add_subplot(1, 1, 1) 
t = np.linspace(0,2, 1000) 

ax.grid(True) 
ax.set_ylabel("Cumulative Probability Density") 
ax.set_title("Fit to Normal Distribution") 

mu1,sigma1 = norm.fit(Pn_final) # classical fit 
ax.plot(t, norm.cdf(t, mu1, sigma1), alpha=.5) 

mu1,sigma1 = norm.fit(Pd_final) # classical fit 
ax.plot(t, norm.cdf(t, mu1, sigma1), alpha=.5) 

ax.plot(testrefratios, Pn_final, 'bo',label='numerosity comparison') 
ax.plot(testrefratios, Pd_final, 'ro', label='density comparison') 

plt.legend(loc='lower right') 


fg.canvas.draw() 

出力:現時点では

Fit results with code shown

答えて

3

、何もあなたが累積ガウスに合うようにしようとしているシステムを語っているやっています。 norm.fit(Pn_final)は、Pn_finalガウスを表すと仮定して最善を尽くしています。

一つの方法は、scipy.optimize.curve_fitを使用することで、及び

from scipy.optimize import curve_fit 

mu1,sigma1 = curve_fit(norm.cdf, testrefratios, Pn_final, p0=[0,1])[0] 
ax.plot(t, norm.cdf(t, mu1, sigma1), alpha=.5) 

mu1,sigma1 = curve_fit(norm.cdf, testrefratios, Pd_final, p0=[0,1])[0] 
ax.plot(t, norm.cdf(t, mu1, sigma1), alpha=.5) 

を追加することは、少なくとも、より真実味に見えた私に

example fit

を与えるでしょう。

+0

これは、 'Pn_final'と' Pd_final'値を経験的なcdf値として扱います。 – ayhan

+0

ありがとう、これは完璧です。 – galliwuzz

関連する問題