【问题标题】:skew normal distribution in scipyscipy中的偏斜正态分布
【发布时间】:2011-08-18 14:12:05
【问题描述】:

有谁知道如何用 scipy 绘制偏态正态分布? 我认为可以使用 stats.norm 类,但我不知道如何使用。 此外,如何估计描述一维数据集偏态正态分布的参数?

【问题讨论】:

    标签: python statistics distribution scipy


    【解决方案1】:

    来自维基百科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()
    

    如果您想从数据集中查找比例、位置和形状参数,请使用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)
    

    【讨论】:

      【解决方案2】:

      接受的答案或多或少已经过时了,因为 skewnorm 函数现在在 scipy 中实现。所以代码可以写得更短:

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

      【讨论】:

      • 需要一个额外的 ) 在 plt.plot 行的末尾。虽然太短,无法接受编辑
      • @BlueTurtle 谢谢,我加了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2014-01-17
      • 2014-02-20
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多