1. 程式人生 > >PyMC3中常見連續概率分佈

PyMC3中常見連續概率分佈

連續分佈

1.均勻分佈

class pymc3.distributions.continuous.Uniform(lower = 0,upper = 1,* args,** kwargs )

均勻分佈的概率密度函式為:

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid')
x = np.linspace(-3, 3, 500)
ls = [0., -2]
us = [2., 1]
for l, u in zip(ls, us):
    y = np.zeros(500)
    y[(x<u) & (x>l)] = 1.0/(u-l)
    plt.plot(x, y, label='lower = {}, upper = {}'.format(l, u))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.ylim(0, 1)
plt.legend(loc=1,fontsize=14)
plt.show()

 2.正態分佈

class pymc3.distributions.continuous.Normal(mu=0, sd=None, tau=None, **kwargs)
'''
mu:均值
sd:標準差(>0),僅在未指定tau時才需要。
tau:精度(>0),僅在未指定sd時才需要。
'''

正態分佈的概率密度函式為:

正態分佈可以在精度或標準偏差方面進行引數化。兩個引數之間的關係由下式給出:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(-5, 5, 1000)
mus = [0., 0., 0., -2.]
sds = [0.4, 1., 2., 0.4]
for mu, sd in zip(mus, sds):
    pdf = st.norm.pdf(x, mu, sd)
    plt.plot(x, pdf, label=r'$\mu$ = {}, $\sigma$ = {}'.format(mu, sd))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1,fontsize=12)
plt.show()

logp(value)
'''
計算正態分佈在指定值的對數概率。
引數:value (numeric) – 計算對數概率的值。如果需要多個值的對數概率,則必須以numpy陣列或theano張量值提供值
Returns:TensorVariable
'''

3.截斷正態分佈

class pymc3.distributions.continuous.TruncatedNormal(mu = 0,sd = None,tau = None,lower = None,upper = None,transform ='auto',* args,** kwargs )
'''
引數:	
mu - 均值。
sd(float) - 標準偏差(sd> 0)。
lower(float (可選)) - 左邊界。
upper(float (可選)) - 右邊界。
'''

 概率密度函式為:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(-10, 10, 1000)
mus = [0.,  0., 0.]
sds = [3.,5.,7.]
a1 = [-3, -5, -5]
b1 = [7, 5, 4]
for mu, sd, a, b in zip(mus, sds,a1,b1):
    an, bn = (a - mu) / sd, (b - mu) / sd
    pdf = st.truncnorm.pdf(x, an,bn, loc=mu, scale=sd)
    plt.plot(x, pdf, label=r'$\mu$ = {}, $\sigma$ = {}, a={}, b={}'.format(mu, sd, a, b))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1,fontsize=12)
plt.show()

 4.Beta分佈

class pymc3.distributions.continuous.Beta(alpha=None, beta=None, mu=None, sd=None, *args, **kwargs)
'''
引數:	
alpha - alpha> 0。
beta - beta> 0。
mu- 均值(0 <mu <1)。
sd - 標準差(0 <sd <sqrt(mu *(1-mu)))。

'''

概率密度函式為:

均值,方差:

注:Beta分佈是 二項分佈 的共軛先驗

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(0, 1, 200)
alphas = [.5, 5., 1., 2., 2.]
betas = [.5, 1., 3., 2., 5.]
for a, b in zip(alphas, betas):
    pdf = st.beta.pdf(x, a, b)
    plt.plot(x, pdf, label=r'$\alpha$ = {}, $\beta$ = {}'.format(a, b))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.ylim(0, 4.5)
plt.legend(loc=9)
plt.show()

 5.指數分佈

class pymc3.distributions.continuous.Exponential(lam, *args, **kwargs)

概率密度函式:

均值,方差:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(0, 3, 100)
for lam in [0.5, 1., 2.]:
    pdf = st.expon.pdf(x, scale=1.0/lam)
    plt.plot(x, pdf, label=r'$\lambda$ = {}'.format(lam))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1)
plt.show()

6.拉普拉斯分佈:

class pymc3.distributions.continuous.Laplace(mu, b, *args, **kwargs)
'''
引數:	
mu(float) - 位置引數。
b(float) - 比例引數(b> 0)。
'''

概率密度函式:

均值和方差為:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(-10, 10, 1000)
mus = [0., 0., 0., -5.]
bs = [1., 2., 4., 4.]
for mu, b in zip(mus, bs):
    pdf = st.laplace.pdf(x, loc=mu, scale=b)
    plt.plot(x, pdf, label=r'$\mu$ = {}, $b$ = {}'.format(mu, b))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1)
plt.show()

 7.t分佈

class pymc3.distributions.continuous.StudentT(nu, mu=0, lam=None, sd=None, *args, **kwargs)
'''
引數:	
nu(float) - 自由度,也稱為正態引數(nu> 0)。
mu(float) - 位置引數。
sd(float) - 比例引數(sd> 0)。當nu增加時,收斂於標準偏差。(僅在未指定lam時才需要)
lam(float) - 比例引數(lam> 0)。隨著nu的增加,精度趨於一致。(僅在未指定sd時才需要)
'''

概率密度函式:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(-8, 8, 200)
mus = [0., 0., -2., -2.]
sds = [1., 1., 1., 2.]
dfs = [1., 5., 5., 5.]
for mu, sd, df in zip(mus, sds, dfs):
    pdf = st.t.pdf(x, df, loc=mu, scale=sd)
    plt.plot(x, pdf, label=r'$\mu$ = {}, $\sigma$ = {}, $\nu$ = {}'.format(mu, sd, df))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1)
plt.show()

 8.Gamma分佈

class pymc3.distributions.continuous.Gamma(alpha=None, beta=None, mu=None, sd=None, *args, **kwargs)
'''
引數:	
alpha(float) - 形狀引數(alpha> 0)。
beta(float) - 速率引數(beta> 0)。
mu(float) - 可選形狀引數(mu> 0)。
sd(float) - 可選比例引數(sd> 0)。
'''

概率密度函式:

均值和方差為:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(0, 20, 200)
alphas = [1., 2., 3., 7.5]
betas = [.5, .5, 1., 1.]
for a, b in zip(alphas, betas):
    pdf = st.gamma.pdf(x, a, scale=1.0/b)
    plt.plot(x, pdf, label=r'$\alpha$ = {}, $\beta$ = {}'.format(a, b))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1)
plt.show()

9.卡方分佈

class pymc3.distributions.continuous.ChiSquared(nu, *args, **kwargs)
'''
引數:	nu(int) - 自由度(nu> 0)
'''

概率密度函式為:

均值和方差:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(0, 15, 200)
for df in [1, 2, 3, 6, 9]:
    pdf = st.chi2.pdf(x, df)
    plt.plot(x, pdf, label=r'$\nu$ = {}'.format(df))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.ylim(0, 0.6)
plt.legend(loc=1)
plt.show()

10.半正太分佈

class pymc3.distributions.continuous.HalfNormal(sd=None, tau=None, *args, **kwargs)
'''
引數:	
sd(float) - 比例引數sigma(sd> 0)(僅在tau未指定時才需要)。
tau(float) - 精度tau(tau> 0)(僅在未指定sd時才需要)。

'''

概率密度函式:

均值和方差:

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
plt.style.use('seaborn-darkgrid')
x = np.linspace(0, 5, 200)
for sd in [0.4, 1., 2.]:
    pdf = st.halfnorm.pdf(x, scale=sd)
    plt.plot(x, pdf, label=r'$\sigma$ = {}'.format(sd))
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(loc=1)
plt.show()

 參考: