歪正規分布(Skew Normal Distribution)をmatplotlibでプロット

 

正規分布やポワソン分布はいろんなパッケージが準備されてるけど、歪正規分布はなかなか見つからなかったので、
PASTEBIN
skew normal distribution in scipy
Skew Normal Distribution
などを参考にしてプロットしてみました。
 

歪正規分布(Skew Normal Distribution)


歪正規分布の確率密度関数はパラメータ\lambdaを使って以下のように定義されている。

 \displaystyle f(x,\lambda) = 2\phi (x) \Phi (\lambda x), \; \lambda >0

ここで、

\displaystyle \phi (x)=\frac{1}{\sqrt{2\pi}}\exp (-\frac{x^2}{2})

\displaystyle  \Phi (x)=\int ^{x}_{-\infty} \phi (t)dt = \frac{1}{2}[1+erf (\frac{x}{\sqrt{2}})]

コードはPASTEBINに紹介されているように定義されてる関数をそのまま返すだけ。erf関数はscipy.special.erfを使う。

例えばこんな感じ。

from pylab import plot,show
from numpy import exp,sqrt,pi,arange
from scipy.special import erf

# probability distribution function
def pdf(x):
    return exp(-x*x/2.0)/sqrt(2*pi)

# cumulative distribution function
def cdf(x):
    return (1.0+erf(x/sqrt(2)))/2.0

# skew normal distribution
def skew(x,mu,sigma,l):
    z= (x-mu)/sigma
    return 2/sigma * pdf(z) * cdf(l*x)

# define distribution parameters
mu=0.0
sigma=1.0
lam=4.0

# plot 
x=arange(-10,10,0.01)
y=skew(x,mu,sigma,lam)
plot(x,y)
show()

 

プロット


パラメータをいじってみたらこんな感じ。簡単のため平均=0、標準偏差=1にしてあります。

Skew Normal Distribution

こっちは標準偏差を変えてみた場合(\lambda=3

Skew Normal Distribution