2011-05-04 15 views
16

Czy ktoś wie, jak wykreślić skośny rozkład normalny z scipy? Założę się, że klasa stats.norm może być używana, ale nie mogę pojąć, jak to zrobić. Ponadto, w jaki sposób mogę oszacować parametry opisujące skośny rozkład normalny jednowymiarowego zestawu danych?Skew normalna dystrybucja w scipy

Odpowiedz

36

Z Wikipedia description,

from scipy import linspace 
from scipy import pi,sqrt,exp 
from scipy.special import erf 

from pylab import plot,show 

def pdf(x): 
    return 1/sqrt(2*pi) * exp(-x**2/2) 

def cdf(x): 
    return (1 + erf(x/sqrt(2)))/2 

def skew(x,e=0,w=1,a=0): 
    t = (x-e)/w 
    return 2/w * pdf(t) * cdf(a*t) 
    # You can of course use the scipy.stats.norm versions 
    # return 2 * norm.pdf(t) * norm.cdf(a*t) 


n = 2**10 

e = 1.0 # location 
w = 2.0 # scale 

x = linspace(-10,10,n) 

for a in range(-3,4): 
    p = skew(x,e,w,a) 
    plot(x,p) 

show() 

Jeśli chcesz znaleźć skalę, lokalizację i parametry kształtu z zastosowania zestawu danych scipy.optimize.leastsq, na przykład stosując e=1.0, w=2.0 i a=1.0,

fzz = skew(x,e,w,a) + norm.rvs(0,0.04,size=n) # fuzzy data 

def optm(l,x): 
    return skew(x,l[0],l[1],l[2]) - fzz 

print leastsq(optm,[0.5,0.5,0.5],(x,)) 

powinien dać coś w rodzaju,

(array([ 1.05206154, 1.96929465, 0.94590444]), 1) 
+0

Dziękuję @ szlafrok! – Ben2209