1. 程式人生 > >scipy.stats —— 概率、隨機變數與分佈

scipy.stats —— 概率、隨機變數與分佈

import numpy as np
import scipy.stats as st
  • 機率(odds)

    p(B)=120p(B)=\frac1{20}:二十場比賽只贏一場
    **odds against B winning: ** o(B)=1p(B)p(B)=19o(B)=\frac{1-p(B)}{p(B)}=19
    A贏19場比賽,B才會贏一場

0. 常見分佈

  • 泊松分佈:st.poisson(lambda)
  • 指數分佈:st.expon
  • 二項分佈:st.binom(n, p)
  • 正態分佈:st.norm
  • beta分佈:st.beta
  • gamma分佈:st.gamma

1. scipy.stats vs. scipy.special

  • scipy.special:中定義的是一些特殊的函式;
    • scipy.special.beta:表示的是beta函式;
    • scipy.special.gamma:表示的則是 gamma 函式
  • scipy.stats:定義的則是概率分佈;
    • scipy.stats.beta:表示的是 beta 分佈;
    • scipy.stats.gamma:表示的是 gamma 分佈;

2. 建立隨機變數(rv:random variable)

  • 泊松分佈

    F_true = 1000
    N = 50
    F = st.poisson(F_true).rvs(N)
    				# 泊松分佈為離散型概率分佈
    

    也可以這樣:

    mu_true, sigma_true = 1000, 15
    N = 100
    F_true = st.norm(mu_true, sigma_true).rvs(N)
    F = st.poisson(F_true).rvs()
    
  • 二項分佈

    # python
    >>> import scipy.stats as st
    >>> n, p = 100, .5
    >>> X = st.binom(n, p)
    						# 隨機變數X:投100次硬幣正面出現的個數
    						# 用二項分佈表示
    >>> X.mean()
    50.0						# mu = n*p = 100*.5 
    >>> X.std()
    5.0							# sigma = sqrt(n*p*q)=sqrt(100*.5*.5)
    

    st.binom(100, .5).rvs() ⇒ 取樣(trial);

3. 連續性概率分佈函式:pdf

pdf 表示的是函式,給一定輸入值,就會得到一個輸出值,而不是隨機變數。

  • st.norm.pdf(0, loc=0, scale=1) ⇒ 12π\frac1{\sqrt{2\pi}}

    如下程式碼繪製出 f(x)=12πexp((x1)22)f(x)=\frac1{\sqrt{2\pi}}\exp(-\frac{(x-1)^2}{2})

    mu, sigma = 1, 1
    xs = np.linspace(-5, 5, 1000)
    plt.plot(x, st.norm.pdf(xs, loc=mu, scale=sigma))
    plt.show()
    
  • st.multivariate_normal:多元正態分佈;
    <a href=“https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.multivariate_normal.html”, target="_blank">scipy.stats.multivariate_normal

    • 直接傳遞xx,根據概率密度函式(pdf)獲得其值;
    x = np.linspace(0, 5, 10, endpoint=False)
    y = st.multivariate_normal.pdf(x, mean=2.5, cov=.5)
    
    • 首先定義隨機變數,再取得 pdf 在各個位置上的值;
    x, y = np.mgrid[-1:1:.01, -1:1:.01]
    pos = np.empty(x.shape + (2,))
    pos[:, :, 0] = x; pos[:, :, 1] = y
    rv = multivariate_normal([0, 0], [[1, 0], [0, 1]])
    plt.contourf(x, y, rv.pdf(pos))