scipy 中的偏斜正态分布

发布于 2024-11-05 15:27:47 字数 90 浏览 2 评论 0原文

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

Does anyone know how to plot a skew normal distribution with scipy?
I supose that stats.norm class can be used but I just can't figure out how.
Furthermore, how can I estimate the parameters describing the skew normal distribution of a unidimensional dataset?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

音栖息无 2024-11-12 15:27:47

来自维基百科描述

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)

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

If you want to find the scale, location, and shape parameters from a dataset use scipy.optimize.leastsq, for example using e=1.0,w=2.0 and 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,))

should give you something like,

(array([ 1.05206154,  1.96929465,  0.94590444]), 1)
我的痛♀有谁懂 2024-11-12 15:27:47

接受的答案或多或少已经过时了,因为现在在 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)))

The accepted answer is more or less outdated, because a skewnorm function is now implemented in scipy. So the code can be written a lot shorter:

 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)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文