scipy中的偏态正态分布

24

有人知道如何使用scipy绘制偏态正态分布吗? 我猜可以使用stats.norm类,但我就是不知道怎么弄。 此外,如何估计描述一维数据集的偏态正态分布的参数?

2个回答

42

根据维基百科的描述

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

如果您想从数据集中找到比例、位置和形状参数,请使用scipy.optimize.leastsq,例如,使用e=1.0w=2.0a=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,))

应该会给你类似以下的内容,
(array([ 1.05206154,  1.96929465,  0.94590444]), 1)

19

接受的答案有些过时了,因为现在在scipy中已经实现了一个skewnorm函数。因此代码可以写得更短:

接受的答案有些过时了,因为现在在scipy中已经实现了一个skewnorm函数。因此代码可以写得更短:

 from scipy.stats import skewnorm
 import numpy as np
 from matplotlib import pyplot as plt
 
 X = np.linspace(min(your_data), max(your_data))
 plt.plot(X, skewnorm.pdf(X, *skewnorm.fit(your_data)))

1
在 plt.plot 行的末尾需要一个额外的 )。虽然太短而无法接受编辑。 - BlueTurtle
@BlueTurtle 謝謝,我已經添加了。 - mcocdawc
如果X是您生成的数据,那么your_data是什么? - MUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接