2011-05-04 20 views
16

¿Alguien sabe cómo trazar una distribución normal oblicua con scipy? Supongo que se puede usar la clase stats.norm, pero no puedo entender cómo. Además, ¿cómo puedo estimar los parámetros que describen la distribución normal oblicua de un conjunto de datos unidimensional?distribución normal oblicua en scipy

Respuesta

36

Desde la 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() 

Si usted quiere encontrar la escala, la ubicación y los parámetros de forma de un uso conjunto de datos scipy.optimize.leastsq, por ejemplo usando e=1.0, w=2.0 y 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,)) 

debería darle algo como,

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

¡Gracias @lafrasu! – Ben2209

Cuestiones relacionadas