### This notebook computes the joint likelihood in 5 dimensions for the parameters of interest (see below). See inference_demo for more details about basic usage

```python
from lenslikelihood.measurements import flux_measurements, flux_measurement_uncertainties, all_lens_names, all_param_ranges_version2
import numpy as np

# Note that the syntax for the uncertainties is
# {'lens_name': (1-sigma-uncertainty, reference_index, uncertainty_in_ratio)}
# where reference_index is the reference image with which to compute the flux ratio, and uncertainty_in_ratio specifies
# whether the measurement uncertainty refers to the flux or the flux ratio

for name in all_lens_names:
    print(name)
    print('fluxes/flux ratios measured: ', flux_measurements[name])
    print('uncertainties: ', flux_measurement_uncertainties[name])
    print('\n')
```

    HE0435
    fluxes/flux ratios measured:  [0.96  0.976 1.    0.65 ]
    uncertainties:  ([0.05, 0.049, 0.048, 0.056], 0, False)

    WGD2038
    fluxes/flux ratios measured:  [0.86 1.   0.79 0.4 ]
    uncertainties:  ([0.01, 0.01724137931034483, 0.021739130434782608, 0.021739130434782608], 0, False)

    B1422
    fluxes/flux ratios measured:  [0.88  1.    0.474 0.025]
    uncertainties:  ([0.011363636363636364, 0.01, 0.012765957446808512, None], 0, False)

    WFI2033
    fluxes/flux ratios measured:  [1.   0.65 0.5  0.53]
    uncertainties:  ([0.03, 0.046875, 0.04, 0.03773584905660377], 0, False)

    PSJ1606
    fluxes/flux ratios measured:  [1.   1.   0.59 0.79]
    uncertainties:  ([0.03, 0.03, 0.03333333333333333, 0.02564102564102564], 0, False)

    WFI2026
    fluxes/flux ratios measured:  [1.   0.75 0.31 0.28]
    uncertainties:  ([0.02, 0.02666666666666667, 0.06451612903225806, 0.03571428571428571], 0, False)

    RXJ0911
    fluxes/flux ratios measured:  [0.56 1.   0.53 0.24]
    uncertainties:  ([0.07142857142857142, 0.05, 0.07547169811320754, 0.16666666666666669], 0, False)

    MG0414
    fluxes/flux ratios measured:  [1.   0.83 0.36 0.16]
    uncertainties:  ([0.06024096385542169, 0.11111111111111112, 0.11764705882352941], 0, True)

    PG1115
    fluxes/flux ratios measured:  [1.   0.93 0.16 0.21]
    uncertainties:  ([0.06451612903225806, 0.43750000000000006, 0.1904761904761905], 0, True)

    RXJ1131
    fluxes/flux ratios measured:  [1.   0.61 0.73 0.12]
    uncertainties:  ([[0.012345679012345678, 0.024691358024691357], [0.10084033613445378, 0.025210084033613446], None], 1, True)

    WGDJ0405
    fluxes/flux ratios measured:  [0.8  0.52 1.   0.94]
    uncertainties:  ([0.04, 0.061538461538461535, 0.024, 0.03418803418803419], 0, False)

### Models implemented for the halo mass function and concentration-mass relation

The full set of hyper-parameters we're interested in constraining are defined by the parameterizations of the halo mass function and concentration-mass relation. They are $\Sigma_{\rm{sub}}$, $\delta_{\rm{LOS}}$, $\Delta \alpha$, $q$, $c_8$, and $\beta$. The first four define to the subhalo and field halo mass functions, and the last two define the concentration-mass relation.

The field halo mass function is parameterized as
\begin{equation}
\frac{dN_{\rm{LOS}}}{dm dV} = \delta_{\rm{LOS}} \left(1+\xi_{\rm{2halo}}\right) \left(\frac{m}{10^8}\right)^{\Delta \alpha} \ \frac{dN_{\rm{ShethTormen}}}{dm dV}
\end{equation}
where $\delta_{\rm{LOS}}$ scales the overall normalization, and $\Delta \alpha$ parameterizes deviations from the logarithmic slope predicted by CDM around $10^8 M_{\odot}$.

The subhalo mass function is parameterized as
\begin{equation}
\frac{dN_{\rm{sub}}}{dm dA} \sim \Sigma_{\rm{sub}} \ \left(\frac{m}{10^8}\right)^{\alpha + q \Delta \alpha}
\end{equation}
where $\Sigma_{\rm{sub}}$ is the normalization, $\alpha$ is the logarithmic slope predicted by CDM, $\Delta \alpha$ parameterizes deviations from the value predicted by CDM, and $q$ controls the coupling between the line of sight halo mass function slope and the subhalo mass function slope. When $q=1$ the slopes change in the same way, and when $q=0$ the slopes of the subhalo and field halo mass functions are completely decoupled.

The concentration-mass relation is parameterized as

\begin{equation}
c\left(M, z\right) = c_8 \left(1+z\right)^{\zeta} \left(\frac{\nu\left(M, z\right)}{\nu\left(10^8, z\right)}\right)^{-\beta}
\end{equation}
i.e. it is a power-law in the peak height $\nu$ with normalization $c_8$ at $10^8$ and a logarithmic slope $\beta$. The parameter $\zeta$ modifies the redshift evolution and is marginalized over in the sampling.

The parameter names used in the python code have the following correspondence:

1) sigma_sub = $\Sigma_{\rm{sub}}$

2) delta_power_law_index = $\Delta \alpha$

3) c0 = $c_8$

4) beta = $\beta$

5) delta_power_law_index_coupling = $q$

6) LOS_normalization = $\delta_{\rm{LOS}}$

### Example inference on three parameters with a subset of lenses

First load the model samples, define what parameters we want to look at

```python
import pickle
import matplotlib.pyplot as plt
# specify the parameter names
param_names = ['LOS_normalization', 'beta', 'log10c0', 'delta_power_law_index', 'sigma_sub']

param_ranges = [all_param_ranges_version2[name] for name in param_names]
print(param_ranges)
# specify the lenses to use
lenses = all_lens_names
raw_samples_dict = {}
# load the forward model samples
for lens in lenses:
#for lens in ['HE0435']:
    print(lens)
    f = open('./../raw_samples/power_spectrum/'+lens+'_logprior', 'rb')
    raw_samples = pickle.load(f)
    f.close()
    raw_samples_dict[lens] = raw_samples
    print('number of samples: ', len(raw_samples.samples_dictionary['beta']))
```

    [[0.0, 2.5], [-0.2, 15.0], [0, 4], [-0.6, 0.9], [0, 0.125]]
    HE0435
    number of samples:  2177080
    WGD2038
    number of samples:  1486760
    B1422
    number of samples:  1281430
    WFI2033
    number of samples:  1775092
    PSJ1606
    number of samples:  1774039
    WFI2026
    number of samples:  1383086
    RXJ0911
    number of samples:  1590968
    MG0414
    number of samples:  1724080
    PG1115
    number of samples:  2252901
    RXJ1131
    number of samples:  7832445
    WGDJ0405
    number of samples:  8922308

The next cell computes the joint likelihood without any importance sampling weights.

```python
# compute the summary statistics, retaining the 1500 sets of model parameters with lowest summary statistic
n_samples_keep_list = [3500] * len(lenses)
# n_samples_keep_list[-4] = 2500
# n_samples_keep_list[-3] = 2500
# n_samples_keep_list[0] = 2500
samples_dict = {}
fig = plt.figure(1)
fig.set_size_inches(8,8)
for n_samples_keep, lens in zip(n_samples_keep_list, lenses):
#for n_samples_keep, lens in zip([3500], ['B1422']):
    print(n_samples_keep)
    print('working on lens '+str(lens) + '... ')
    measured_fluxes = flux_measurements[lens]
    measurement_uncertainties = flux_measurement_uncertainties[lens][0]
    reference_index = flux_measurement_uncertainties[lens][1]
    uncertaintiy_in_flux_ratios = flux_measurement_uncertainties[lens][2]

    importance_sampling_weights = None

    samples, full_samples, statistic = raw_samples_dict[lens].sample_with_abc(measured_fluxes,
                                                                   param_names,
                                                                   measurement_uncertainties,
                                                                   reference_index,
                                                                   n_samples_keep,
                                                                    n_draw=10,
                                                                   uncertaintiy_in_ratios=uncertaintiy_in_flux_ratios,
                                                                   importance_sampling_weights=importance_sampling_weights,
                                                                             stat_cut=0.1)
    plt.hist(statistic, alpha=0.5, label=lens, density=True)
    samples_dict[lens] = samples

# the histogram shows the distribution of the retained summary statistics
plt.legend(fontsize=12)
plt.xlim(0., 0.06)
plt.xlabel('summary statistic', fontsize=14)
plt.show()
```

Now we compute the likelihood using the package trikde https://github.com/dangilman/trikde

```python
from trikde.pdfs import DensitySamples, IndepdendentLikelihoods
import os

nbins = 20
likelihoods = []

load_from_pickle = False # if True, will look for a pre-computed DensitySamples class
save_to_pickle = True # if True, will pickle each class for accelerated later use;
# save_to_pickle=True will do nothing if load_from_pickle=True

filename_extension = '_joint_logprior'
base_path = './../lenslikelihood/precomputed_likelihoods/'

#for lens in ['B1422']:
for lens in all_lens_names:
    #if lens =='B1422': continue

    fname = base_path + lens + filename_extension
    if load_from_pickle and os.path.exists(fname):
        print('loading joint likelihoods for lens '+lens+' ...')
        f = open(fname, 'rb')
        single_lens_likelihood = pickle.load(f)
        f.close()
    else:
        print('computing joint likelihoods for lens '+lens+' ...')
        lens_samples = samples_dict[lens]
        weights=None
        single_lens_likelihood = DensitySamples(lens_samples, param_names, weights,
                                 param_ranges, nbins=nbins, use_kde=True, bandwidth_scale=0.9)
        if save_to_pickle:
            f = open(fname, 'wb')
            pickle.dump(single_lens_likelihood, f)
            f.close()
    likelihoods.append(single_lens_likelihood)

likelihood = IndepdendentLikelihoods(likelihoods)
```

    computing joint likelihoods for lens HE0435 ...
    computing joint likelihoods for lens WGD2038 ...
    computing joint likelihoods for lens B1422 ...
    computing joint likelihoods for lens WFI2033 ...
    computing joint likelihoods for lens PSJ1606 ...
    computing joint likelihoods for lens WFI2026 ...
    computing joint likelihoods for lens RXJ0911 ...
    computing joint likelihoods for lens MG0414 ...
    computing joint likelihoods for lens PG1115 ...
    computing joint likelihoods for lens RXJ1131 ...
    computing joint likelihoods for lens WGDJ0405 ...

### The joint likelihood/posterior with no modeling assumptions (indepedent, uniform priors on all model parameters).

```python
from trikde.triangleplot import TrianglePlot
print(param_ranges)
triangle_plot = TrianglePlot([likelihood])
triangle_plot.set_cmap('magma')
axes = triangle_plot.make_triplot(filled_contours=False, show_intervals=False, show_contours=False
                                 )
# can change axis labels
```

```python
from trikde.pdfs import CustomPriorHyperCube
from trikde.kde import KDE

def couple_mass_functions(samples, sigma_sub_theory=0.05, coupling_strength=0.2, edge_coupling=0.2):

    delta_los_samples = samples[:, 0]
    sigma_sub_samples = samples[:, -1]
    delta_sigma_sub = sigma_sub_samples/sigma_sub_theory

    edge_dlos = 2.5/10
    edge_sigma_sub = 0.1/10

    cond1 = delta_los_samples < edge_dlos
    cond2 = sigma_sub_samples < edge_sigma_sub
    inds_1 = np.logical_and(cond1, cond2)
    cond1 = delta_los_samples > 2.5 - edge_dlos
    cond2 = sigma_sub_samples > 0.1 - edge_sigma_sub
    inds_2 = np.logical_and(cond1, cond2)

    chi2 = (delta_sigma_sub - delta_los_samples)**2/coupling_strength**2
    chi2[inds_1] *= coupling_strength ** 2 / edge_coupling ** 2
    chi2[inds_2] *= coupling_strength ** 2 / edge_coupling ** 2

    return chi2

kwargs_1 = {'sigma_sub_theory': 0.05}
prior_on_mass_functions_1 = CustomPriorHyperCube(couple_mass_functions, param_names, param_ranges,
                                                 nbins, kwargs_1)
likelihoods_coupled_with_prior_mass_functions = likelihoods + [prior_on_mass_functions_1]
likelihood_coupled_with_prior_mass_functions_1 = IndepdendentLikelihoods(likelihoods_coupled_with_prior_mass_functions)

kwargs_2 = {'sigma_sub_theory': 0.025}
prior_on_mass_functions_2 = CustomPriorHyperCube(couple_mass_functions, param_names, param_ranges, nbins, kwargs_2)
likelihoods_coupled_with_prior_mass_functions = likelihoods + [prior_on_mass_functions_2]
likelihood_coupled_with_prior_mass_functions_2 = IndepdendentLikelihoods(likelihoods_coupled_with_prior_mass_functions)
```

```python
triangle_plot = TrianglePlot([likelihood_coupled_with_prior_mass_functions_1])
triangle_plot.set_cmap('jet')
axes = triangle_plot.make_triplot(filled_contours=False, show_intervals=False, show_contours=False
                                 )
```

```python
triangle_plot = TrianglePlot([likelihood_coupled_with_prior_mass_functions_2])
triangle_plot.set_cmap('jet')
axes = triangle_plot.make_triplot(filled_contours=False, show_intervals=False, show_contours=False
                                 )
```

```python
edge_effect_likelihood = IndepdendentLikelihoods([DensitySamples()])
triangle_plot = TrianglePlot([edge_effect_likelihood])
triangle_plot.set_cmap('magma')
```

```python

```


# Use Python in Advanced Statistics

*這個學期剛剛學完了概率論與數理統計，這好趁這個機會複習一下並複習一下 `python`*

## Chapter One Probability

### 隨機試驗與樣本空間（Random Experiment and Sample Space）

#### 隨機試驗
隨機試驗是概率論中一個基本的概念。概括的講，在概率論中把符合下面三個特點的試驗叫做隨機試驗：
* 可以在向空的條件下重複進行；
* 每次試驗的可能結果不只一個，並且事先明確試驗的所有可能結果；
* 進行一次試驗之前不能確定哪一個結果會出現。

隨機試驗有很多種，例如常出現的擲骰子，摸球，射擊等。所有的隨機試驗的結果可以分為兩類來表示：

* 數量化表示：射擊命中的次數，商場每個小時的客流量，每天經過某個收費站的車輛等，這個結果本事就是數字；
* 非數量化表示：拋硬幣的結果（正面/反面），化驗的結果（陽性/陰性）等，這些結果是定型的，非數量化的。但是可以用示性函數來表示，例如可以規定正面（陽性）為$1$，反面為$0$，這樣就可以實現了非數量化結果的數量化。

#### 樣本空間（Sample Space）：

* 隨機試驗的所有可能結果構成的集合。一般即為$S$（capital S）；
* $S$ 中的元素$e$稱為樣本點（也可以叫基本事件）；
* 事件是樣本空間的子集，同樣是一個集合。

#### 事件的關係
* 事件的包含：$A \subseteq B$;
* 事件的相等：$A = B$;
* 互斥事件（互不相容事件）：不能同時出現；
* 事件的和（並）：$A cup B$
* 事件的差： $A - B$,$A$發生，$B$不發生；
* 對立事件（逆事件）：互斥，必須出現其中一個。

事件的運算性質就是集合的性質

### 頻率和概率

#### 頻率：

頻率是指$0～1$之間的一個實數，在大量重複試驗的基礎上給出了隨機事件發生可能性的估計。

概率的穩定性：在充分多次試驗中，事件的頻率總在一個定值附近擺動，而且，試驗次數越多擺動越小。這個性質叫做頻率的穩定性。

#### 概率：

概率的統計性定義：當試驗次數增加時，隨機時間$A$發生的頻率的穩定值為$p$就稱為概率。記為$P(A) = P$

概率的公理化定義：設隨機試驗對於的樣本空間為$S$。對每一個事件$A$，定義為$P(A)$，滿足：

1. 非負性：$P(A) \geq 0$;
2. 規範性：$P(S) = 1;
3. 可列可加性：$A_1, A_2, \dots 兩兩互斥，及$A_iA_j = \oslash, i \neq j$則 $P(\cup A_i) = \sum P(A_i)$

#### 條件概率（Conditional Probability）:
$P(A|B)$表示在事件$B$發生的條件下，事件$A$發生的概率，相當於$A$在$B$所佔的比例。此時，樣本空間從原來的完整樣本空間$S$縮小到了$B$，由於有了條件的約束（事件$B$），使得原本的樣本空間減少了。

下面我們可以通過韋恩圖做示例：

plot one：條件概率的樣本空間；

plot two：條件概率應如何計算

```python
from matplotlib import pyplot as plt
import numpy as np
import sympy

from matplotlib_venn import venn3, venn3_circles
plt.figure(figsize=(4,4))
v = venn2(subsets=(2,2,1), set_labels = ('A', 'B'))

plt.title("Sample Venn diagram - plot one")
plt.annotate('P(AB)', xy=v.get_label_by_id('11').get_position() - np.array([0, 0.05]), xytext=(-70,-70),
             ha='center', textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1),
             arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5',color='gray'))
plt.show()

```

```python
from matplotlib import pyplot as plt
import numpy as np
import sympy

from matplotlib_venn import venn3, venn3_circles
plt.figure(figsize=(4,4))
v = venn2(subsets=(2,2,1), set_labels = ('A', 'B'))

c = venn2_circles(subsets=(2, 2, 1), linestyle='dashed')
c[0].set_lw(1.0)
c[0].set_ls('dotted')
plt.title("Sample Venn diagram")
plt.annotate('P(AB)', xy=v.get_label_by_id('11').get_position() - np.array([0, 0.05]), xytext=(-70,-70),
             ha='center', textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1),
             arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5',color='gray'))
plt.show()
```

$P(B|A) = \frac{P(AB)}{P(A)}$

$P(A|B) = \frac{P(AB)}{P(B)}$

例題：一個家庭中有兩個小孩，已知至少一個是女孩，問兩個都是女孩的概率是多少？（假設生男生女是等可能的）

**解**：由題意可得：樣本空間為

    S = {(兄,弟), (兄,妹),(姐,弟),(姐,妹)}

    B = {(兄,妹), (姐,弟),(姐,妹)}

    A = {(姐,妹)}

由於，事件 $B$ 已經發生了，所以這時試驗的所有可能只有三種，而事件 $A$ 包含的基本事件只占其中的一種，所以有：$P(A|B) = \frac{1}{3}$

即，在已知至少一個是女孩的請卡滾下，兩個都是女孩的概率為$\frac{1}{3}$。在這個例子中，如果不知道事件 $B$ 發生，則事件 $A$ 發生的概率為 $P(A) = \frac{1}{4}$ 這裡的 $P(A) \neq P(A|B)$，其中的原因在於事件 $B$ 的發生改變了樣本空間，使它由原來的 $S$ 縮減為新的樣本空間 $S_B = B$

### 全概率公式和 Bayes 公式

了解完了條件概率，那我了解一下什麼是**聯合概率（Joint Probability）**和**邊緣概率（Marginal Probability）**

**聯合概率**表示兩者同時發生的概率，表示為$P(A\cap B)$或者$P(A,B)$或者$P(AB)$

**邊緣概率**表示某單一事件發生的概率。边缘概率是這樣得到的：在聯合概率中，把最終結果中不需要的那些事件合并成其事件的全概率而消失（對离散隨机變量用求和得全概率，對連續隨机變量用積分得全概率）。這稱為邊緣化（marginalization）。A的边缘概率表示为$P(A)$，B的边缘概率表示为$P(B)$

#### 全概率公式（Law of Total Probability）

設$B_1,B_2,\dots B_n$ 是樣本空間$\Omega$中的兩兩不相容的一組事件，即，$B_i B_j = \emptyset, \ i \neq j$，且 滿足$U^n_{i = 1} = B_i = \Omega$，則稱$B_1,B_2,\dots B_n$是樣本空間$\Omega$的一個分割。

**全概率公式：**設$\{B_1,B_2,\dots B_n\}$是樣本空間$\Omega$的一個分割，且$P(B_i)>0(i = 1,\dots,n)$，$A$為$\Omega$中的一個事件，則:

    $P(A) = \displaystyle \sum^n_{i=1}P(A|B_i)P(B_i)$

#### Bayes 公式
設$\{B_1,B_2,\dots B_n\}$是樣本空間的一個分割，$A$為$\Omega$中的一個事件，$P(B-i)>0,i =1,2,\dots,n,P(A)>0$，則：

    $P(B_i|A) = \frac{P(A|B_i)P(B_i)}{\sum^b_{i=1}P(A|B_j)P(B_j)}$

什麼時候我們會使用 Bayes 公式呢？ 由公式可得，分母就是事件$A$的概率，而份子和等式左邊的條件概率中的條件正好反過來，所以我們知道在因果關係互換時，必須使用 Bayes 公式。

#### 隨機變量（Random Variable）

在幾乎所有教材裡，介紹概率論都是從事件和樣本空間說起的，但是後面的概率論都是圍繞著隨機變量展開的。可以說前面的事件和樣本空間都是引子，引出了隨機變量這個概率論的核心概念。後面的統計學是建立在概率論的理論基礎之上的，因此可以說理解隨機變量這個概念是學習和運用概率論與數理統計的關鍵。

**隨機變量**：

* 首先這是一個變量，變量與常數相對，也就是說其取值是不明確的，其實隨機變量的整個取值範圍就是前面說的樣本空間；
* 其次這個量是隨機的，也就是說它的去職代有不確定性，讓然是在樣本空間這個範圍內的。

**定義：**
> 設隨機試驗的樣本空間是 $S$ ，若對 $S$ 中的每一個樣本點 $e$ ，都有唯一的實數值 $X(e)$ 為隨機變量，間記為 $X$

隨機變量的定義並不複雜，但是理解起來去不是這麼直觀。

* 首先，隨即變量與之前定義的事件是有關係的，因為每個樣本點本身就是一個基本事件；
* 在前面隨機試驗結果的表示中提到，無論是數量化的結果還是非數量化的結果，即不管試驗結果是否與數值有關，都可以引入變量，使試驗結果與數建立對應關係；
* 隨機變量本質上是一種函數，其目的就是建立試驗結果（樣本中的點，同基本事件$e$）與實數之間的對應關係（例如將“正面”影射為$1$，“反面”影射為$0$）；
* 自變量為基本事件$e$，定義域為樣本空間$S$，值域為某個實數集合，多個自變量可以對應同一個函數值，但不允許一個自變量對應多個函數值；
* 隨機變量$X$取某個值或某些值就表示某種事件，且具有一定的概率；
* 隨機變量中的隨機來源於隨機試驗結果的不確定性。

我們可以通過引入隨機變量，我們簡化了隨機試驗結果（事件）的表示，從而可以更加方便的對隨機試驗進行研究。

**隨機變量的分類**:

* 離散隨機變量；
* 連續隨機變量；
* 每類隨機變量都有其獨特的概率密度函數和概率分佈函數。

**隨機變量的數字特徵**：

* 期望（均值），眾數，分位數，中位數；
* 方差；
* 協方差；
* 相關係數。

### 隨機變量（Random Variable）

*對隨機變量以及其取值規律的研究是概率的核心內容。在上一個小結中，總結了隨機變量的概念以及隨機變量與事件的聯繫。這個小結會更加深入的討論隨機變量。*

#### 隨機變量與事件

隨機變量的本質是一種函數（映射關係），在古典概率模型中，“事件和事件的概率”是核心概念；但是在現代概率論中，“隨機變量及其取值規律”是核心概念。

**隨機變量與事件的聯繫與區別**

小結 1 中對著練歌概念的聯繫進行了非常詳細的描述。隨機變量實際上只是事件的另一種表達方式，這種表達方式更加的形式化和符號化，也更佳便於理解以及進行邏輯運算。不同的事件，其實就是隨機變量不同取值的組合。在陈希孺先生的書中，有一個很好的例子來說明這兩者的區別：

> 對於隨機試驗，我們所關心的往往是與所研究的特定問題有關的某個或某些變量，而這些量就是隨機變量。當然，有事我們所關心的是某個或某些特定的隨機時間。例如，在特定一群人中，年收入在萬元以上的高收入者，以及年收入在$3000$元以下的低收入者，各自比率如何？者看上去是兩個孤立的事件。可是當我們引入一個隨機變量$X$：
>
>

>  $X = $ 隨機抽出一個人其年收入
>

>
>則$X$是我們關心的隨機變量。上述兩個事件可以分表表示為$\{X > 10000\}$或$\{X < 3000\}$。這就看出：**隨機事件**這個概念實際上包容在**隨機變量**這個更廣的概念之中。也就是說，隨機事件是靜態的觀點來研究隨機現象，而隨機變量則是一種動態的觀點。「概率論能從計算一些孤立事件的概率發展成為一個更高的理論體系，其根本概念就是隨機變量

*這段話，非常清楚的解釋了隨機變量與事件的區別：就跟變量和常量之間的區別那樣*

#### 隨機變量的分類（The Classification of the Random Variable）

**隨機變量從其可能的取值的性質分為兩大類：離散型隨機變量（Discrete Random Variable）和連續性隨機變量（Continuous Random Variable）**

##### 離散型隨機變量（Discrete Random Variable）

離散型隨機變量的取值在整個實數軸上是有間隔的，要麼只有有限個取值，要麼就是無限可數。

如下圖：

```python
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

def poisson_pmf(mu=3):

    poisson_dis = stats.poisson(mu)
    x = np.arange(poisson_dis.ppf(0.001), poisson_dis.ppf(0.999))
    print(x)

    fig, ax = plt.subplots(1, 1)
    ax.plot(x, poisson_dis.pmf(x), 'bo', ms=8, label='poisson pmf')
    ax.vlines(x, 0, poisson_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    ax.legend(loc='best', frameon=False)
    plt.ylabel('Probability')
    plt.title('PMF of poisson distribution(mu={}) - plot three'.format(mu))
    plt.show()

poisson_pmf(mu=8)
```

```python
def binom_pmf(n=1, p=0.1):
    binom_dis = stats.binom(n, p)
    x = np.arange(binom_dis.ppf(0.0001), binom_dis.ppf(0.9999))
    print(x)

    fig, ax = plt.subplots(1, 1)
    ax.plot(x, binom_dis.pmf(x), 'bo', label='binom pmf')
    ax.vlines(x, 0, binom_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    ax.legend(loc='best', frameon=False)
    plt.ylabel('Probability')
    plt.title('PMF of binomial distribution(n={}, p={}) - plot four'.format(n, p))

    plt.show()

binom_pmf(n=20, p=0.6)
```

* Plot three 是 Poisson Distribution
* Plot four 是 Binomal Distribution

常見的**離散型隨機變量**包括以下這幾種：

* 0-1分佈（Bernoulli Distribution）
* 二項分布（Binomial Distribution）
* 幾何分佈（Geometric Distribution）
* 泊松分佈（Poisson Distribution）
* 超幾何分佈（Hyper-geometric Distribution）

##### 連續型隨機變量（Continuous Random Variable）

連續型隨機變量的取值要麼包括了整個實數集$(-\infty, \infty)$，要麼在一個區間內連續，總之，這一類的隨機變量的可能取值要比離散型隨機變量的取值多得多，個數是無窮不可數的。

**常見的連續型隨機變量包括以下幾種**：

* 均勻分布
* 指數分佈
* 正態分佈（$\gamma$分佈， $\beta$分佈，$\chi^2$分佈等）

##### 概率密度函數的性質

所有的概率密度函數$f(x)$都滿足一下的兩條性質；所有滿足下面兩條性質的一元函數也都可以作為概率密度函數。

$f(x) \geq 0$，以及$\int_{-\infty}^{+\infty}f(x)dx = 1$.

#### 隨機變量的基本性質

隨機變量最主要的性質是其所有可能取到的這些值的取值規律，即取到的概率大小。如果我們把一個隨機變量的所有可能的取值的規律都研究透徹了，那麼這個隨機變量也就研究透徹了。隨機案變量的性質只要有兩類：一類是大而全的性質，這類性質可以詳細描述所有可能取值的概率，律如**累積分佈函數（Cumulative Distribution Funtion）**和**概率密度函數（Probability Density Function）**；另一類是找到該隨機變量的一些特徵或者代表值，例如隨機變量的方差或者期望等數字特徵。常見的隨機變量的性質如下表：

|    name    | 解釋 |
| :---: | :---: |
| CDF: Cumulative Distribution Function |  連續型和離散型隨機變量都有，一般以$F(X)$表示 |
| PDF: Probability Density Function    |  連續型隨機變量在各點的取值規律，用$f(x)$表示 |
| PDF: Probability Density Function    |  連續型隨機變量在各點的取值規律，用$f(x)$表示 |
| PMF: Probability Mass Function    |  離散型型隨機變量在各特定取值上的概率 |
| RVS: Random Variate Sample    |  從一個給定分佈取樣 |
| PPF: Percentile Point Function  |  CDF 的反函數 |
| IQR: Inter Quartile Range   |  $25%$分位數與$75%$ 分位數之差 |

*PDF 只有**連續型隨機變量**才有， PMF 只有**離散型隨機變量**才有；一個分佈的 CDF 求導等於 PDF， 一個分佈的 PDF 積分後就是 CDF*

### 一維離散型隨機變量及其 Python 實現

上一小節，對隨機變量做了一個概述，這一節主要紀錄以為離散變量以及關於他們的一些性質。對於概率論與數理統計方面的計算以及可視化，主要的`pyhton`包有`scipy`，`numpy`和`matplotlib`等。

```python
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
```

`scipy` 是 `python` 中使用最為廣泛的科學計算工具包，在加上`numpy`和`matplotlib`，基本可以處理大多數的計算和作圖任務。下面是`wikipedia`對`scipy`的介紹：

> SciPy是一个开源的Python算法库和数学工具包。SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。与其功能相类似的软件还有MATLAB、GNU Octave和Scilab。SciPy目前在BSD许可证下发布。它的开发由Enthought资助。

我們使用的是 `scipy`中的 `stats`模塊，這個模塊包歡樂概率論以及統計相關的函數。
相關函數可以查詢： scipy stats

####  伯努利分佈（Bernoulli Distribution）

又名兩點分佈或者$0-1$分佈，是一個離散型概率分佈。若伯努利試驗成功，則伯努利隨機變量取值為$1$，如果失敗則取值為$0$。記其成功概率為$p(0\leq p \leq 1)$，失敗概率為：$q = 1-p$。其概率質量函數（PMF） 為：

    $\begin{equation}     \nonumber P_X(x) = \left\{     \begin{array}{l l}     p& \quad \text{for  } x=1\\     1-p & \quad \text{ for } x=0\\     0  & \quad \text{ otherwise }     \end{array} \right. \end{equation}$

```python
from scipy.stats import bernoulli
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 1)

p = 0.8
x = np.linspace(0,1)

plt.plot(x,bernoulli.pmf(x,p),'o-',label='bernoulli pmf')

plt.title('bernoulli pmf')
plt.xlim(-0.1,1.1)
plt.ylim(0,1)

plt.show()
```

伯努利分佈只有一個參數$p$，記做$X ~ Bernuolli(p)$，或$X ~ B(1,p)$，讀做$X$服從參數為$p$的伯努利分佈。伯努利分佈適合於試驗結果只有兩種可能的單次試驗。例如拋一次硬幣，其結果只有正面或者反面兩種可能；一次產品質量檢測，結果只有合格還是不合格這兩種可能。

```python
import scipy.stats as stats
from scipy.stats import bernoulli
import matplotlib.pyplot as plt

def bernoulli_pmf(p=0.0):

    ber_dist = stats.bernoulli(p)
    x = [0, 1]
    x_name = ['0', '1']
    pmf = [ber_dist.pmf(x[0]), ber_dist.pmf(x[1])]
    plt.bar(x, pmf, width=0.15)
    plt.xticks(x, x_name)
    plt.ylabel('Probability')
    plt.title('PMF of bernoulli distribution')
    plt.show()

bernoulli_pmf(p=0.8)
```

上面兩幅圖都是表示伯努利分佈的 PMF；我們為了得到比較準確的某個服從伯努利分佈的隨機變量的期望，需要大量重複伯努利試驗，例如重複$n$次，然後利用$\frac{正面朝上的次數}{n}$來估計$p$值，當我們重複$n$次以後，這就變成了二項分布，就是下面會提到的**二項分布**。

#### 二项分布（Binomial Distribution）

二項分布是指$n$個獨立的是/非試驗中成功的次數的離散概率分佈，其中每次試驗的成功概率為$p$。這樣的單詞成功/失敗試驗又稱為伯努利試驗。實際上，當$n = 1$時，二項分布就是伯努利分佈。二項分布時顯著性差異的二項試驗的基礎。

```python
import scipy.stats as stats
def binom_pmf(n=1, p=0.1):

    binom_dis = stats.binom(n, p)
    x = np.arange(binom_dis.ppf(0.0001), binom_dis.ppf(0.9999))
    #print(x)  # [ 0.  1.  2.  3.  4.]
    fig, ax = plt.subplots(1, 1)
    ax.plot(x, binom_dis.pmf(x), 'bo',label='binom pmf')
    ax.vlines(x, 0, binom_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    ax.legend(loc='best', frameon=False)
    plt.ylabel('Probability')
    plt.title('PMF of binomial distribution(n={}, p={})'.format(n, p))
    plt.show()

binom_pmf(n=20, p=0.6)
```

##### 二項分布和其他分佈的關係

1. 二項分布的和

    如果$X~B(n,p)$ 和$Y~B(n,p)$，且$X$和$Y$相互獨立，那麼$X + Y$ 也服從二項分佈：
    $X + Y～B（n+m, p)$

2. 伯努利分佈

    二項分布就是$n$重伯努利試驗

3. 泊松分佈

   泊松分佈實際上可以通過二項分布推導出來，當$n$很大，$p$很小的時候，我們可以通過極限
   去證明（證明見下方）

 我們首先先畫圖來看，當$n = 100，p = 0.1$時

```python
binom_pmf(n=1000000,p=0.00001)
```

```python
# poisson_distribution_PMF
def poisson_pmf(mu=1):

    poisson_dis = stats.poisson(mu)
    x = np.arange(poisson_dis.ppf(0.001), poisson_dis.ppf(0.999))
    #print(x)
    fig, ax = plt.subplots(1, 1)
    ax.plot(x, poisson_dis.pmf(x), 'bo', ms=8, label='poisson pmf')
    ax.vlines(x, 0, poisson_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    ax.legend(loc='best', frameon=False)
    plt.ylabel('Probability')
    plt.title('PMF of poisson distribution(mu={})'.format(mu))
    plt.show()

poisson_pmf(mu=10)
```

由圖可得：兩者近似相等；下面是數學證明：

Let $X$ be as described,
Let $ k \geq 0$ be fixed, we write $p = \frac{\lambda}{n}$ and suppose
that $n$ is large.

Then:

    $\begin{align*}
    Pr(X = k) &=  \binom n k p^k \left({1 - p}\right)^{n-k} \\& \simeq \frac {n^k} {k!} \left({\frac \lambda n}\right)^k \left({1 - \frac \lambda n}\right)^n \left({1 - \frac \lambda n}\right)^{-k} \\ &= \frac 1 {k!} \lambda^k \left({1 + \frac {-\lambda} n}\right)^n \left({1 - \frac \lambda n}\right)^{-k} \\ &=  \frac 1 {k!} \lambda^k \left({1 + \frac {-\lambda} n}\right)^n \\ &\simeq \frac{1}{k}\lambda^k e^{-\lambda} \end{align*}$

when $n \gg k$ it's a reasonable approximation for $\binom n k $, as $ 1-p = (1 - \frac{\lambda}{n})$ is very close to $1$. Hence the result.

**Comment:**
Okay wise guy, exactly what constitutes "very large", "very small", and "of a reasonable size"?
Well, if $n = 10^6$ and $p = 10^{-5}$, we have np = 10 = \lambda$
That's the sort of order of magnitude we're talking about here.

#### 泊松分佈（Poisson Distribution）

泊松分佈有一個參數$\lambda$（或$\mu$），表示單位事件內隨機事件的平均發生次數，其 PMF 表示為：

    $\begin{equation}\nonumber P_X(k) = \left\{\begin{array}{l l}\frac{e^{-\lambda} \lambda^k}{k!}& \quad \text{for  } k \in R_X\\       0  & \quad \text{ otherwise} \end{array} \right.             \end{equation}$

以上表示單位時間上的泊松分佈，即$t = 1$，如果表示時間$t$上的泊松分佈，則需要將$\lambda$乘以$t$ $\Rightarrow\lambda t$

一個隨機變量$X$服從參數為$\lambda$的柏松分佈，記做$X～Poisson(\lambda)$，或$X～P(\lambda)$。

泊松分佈適合於描述單位時間內隨機時間發生的次數的概率分佈。如，某一服務設施在一定時間內收到的服務請求的次數，電話交換機接到胡椒的次數，機器出現的故障數，DNA序列的變異數等等。

### 一維連續型隨機變量及其 Python 實現

上一小節總結了幾種離散型隨機變量，這個小節總結連續型隨機變量。離散型隨機變量的可能取值為有限多個或者無限可數，而連續型隨機變量的可能取值則為一段連續的區域或者整個實數軸，是不可數的。最常見的連續型隨機變量有三種：均勻分布、指數分佈和正太分佈。

#### 均勻分佈（Uniform Distribution）

如果連續型隨機變量$X$具有如下的概率目睹函數，則稱$X$服從$[a,b]$上的菊允分佈，記做$X～U[a,b]$

    $\begin{equation}              \nonumber f_X(x) = \left\{               \begin{array}{l l}                 \frac{1}{b-a} & \quad  a < x < b\\                 0 & \quad x  b               \end{array} \right.             \end{equation}$

均勻分佈具有等可能性，也就是說服從$U(a,b)$上的均勻分佈的隨機變量$X$落入$(a,b)$中國年的任意子區間的概率只與其取件長度有關，與取件所處的位置無關。

由於是均勻分佈的概率函數是一個常數，因此，其累積分佈函數是一條直線，隨著其取值在定義域內增加，累積分佈函數值均勻增加。

    $\begin{equation} 						  \hspace{70pt}                           F_X(x)  = \left\{                           \begin{array}{l l}                             0 & \quad \textrm{for } x  b                           \end{array} \right. 						  \hspace{70pt}                           \end{equation}$

```python
from scipy.stats import uniform
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)

x = np.linspace(-2, 2)
ax.plot(x, uniform.cdf(x),'r-', lw=5, alpha=0.6)
plt.title("CDF of uniform distribution")

plt.show()
```

均勻分佈主要可以用在：
* 設通過某站的汽車10分鐘一輛，則乘客候車時間$X$，在$[0,10]$上服從均勻分佈；
* 某電台每20分鐘發一個信號，我們隨手打開收音機，等待的時間$X$在$[0,20]$上服從均勻分佈

```python
def uniform_distribution(loc=0, scale=1):
    """
    均匀分布，在实际的定义中有两个参数，分布定义域区间的起点和终点[a, b]
    :param loc: 该分布的起点, 相当于a
    :param scale: 区间长度, 相当于 b-a
    :return:
    """
    uniform_dis = stats.uniform(loc=loc, scale=scale)
    x = np.linspace(uniform_dis.ppf(0.01),
                    uniform_dis.ppf(0.99), 100)
    fig, ax = plt.subplots(1, 1)

    # 直接传入参数
    ax.plot(x, stats.uniform.pdf(x, loc=2, scale=4), 'r-',
            lw=5, alpha=0.6, label='uniform pdf')

    # 从冻结的均匀分布取值
    ax.plot(x, uniform_dis.pdf(x), 'k-',
            lw=2, label='frozen pdf')

    # 计算ppf分别等于0.001, 0.5, 0.999时的x值
    vals = uniform_dis.ppf([0.001, 0.5, 0.999])
    print(vals)  # [ 2.004  4.     5.996]

    # Check accuracy of cdf and ppf
    print(np.allclose([0.001, 0.5, 0.999], uniform_dis.cdf(vals)))  # Ture

    r = uniform_dis.rvs(size=10000)
    ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
    plt.ylabel('Probability')
    plt.title(r'PDF of Unif({}, {})'.format(loc, loc+scale))
    ax.legend(loc='best', frameon=False)
    plt.show()

uniform_distribution(loc=2, scale=4)
```

從定義式中可以看出，定義一個均勻分佈需要兩個參數：定義域的起點$a$和終點$b$，但是在`Python`中是`localtion`是`scale`，分別表示起點和區間長度: scripy.stats.uniform

上面的代碼採用了兩種方式$\Rightarrow$直接傳入參數和先凍結了一個分佈，然後畫出均勻分佈的概率分佈函數。此外還從該分佈中選取了10000個值做直方圖。

上圖是一個均勻分佈：$U(2,6)$的概率密度函數曲線

#### 指數分佈（Exponentinal Distribution）

在概率論和統計學中，指數分佈（Exponential Distribution）是一種連續型的概率分佈。可以用來表示獨立隨機時間發生的時間間隔，比如旅客進入機場的時間間隔，打進客服中心電話的時間間隔、中文維基百科新條目出現的時間等等。其實，指數分佈和離散型的泊松分佈有很大關係。泊松分佈表示的是單位時間（或單位面積）內隨機時間的平均發生次數，指數分佈則可以用來表示獨立隨機事件發生的時間間隔。由於發生次數之能事自然數，所以泊松分佈很自然就是離散型的隨機變量；而時間間隔則可以是任意的實數，因此其定義域為：$(0, +\infty)$

如果一個隨機變量$X$的概率密度函數滿足以下形式，就稱$X$為服從參數$\lambda$的指數分佈（Exponential
Distribution），記做$X～E(\lambda)$或$X～Exp(\lambda)$

指數函數只有一個參數$\lambda$，且$\lambda > 0$

    $\begin{equation}              \nonumber f_X(x) = \left\{               \begin{array}{l l}                 \lambda e^{-\lambda x} & \quad  x > 0\\                 0 & \quad \textrm{otherwise}               \end{array} \right.             \end{equation}$

##### 主要用途：

* 表示獨立隨機案時間發生的時間間隔；
* 在排隊輪中，一個顧客接受服務的時間段也可以用指數分佈來近似；
* 無記憶性的現象（連續時間）

##### 性質

指數分佈的一個顯著的特點就是具有無記憶性。例如如果排隊的顧客接受服務的時間長短服從指數分佈，那麼無論你已經排了多久的隊伍，在排$t$分鐘的概率始終是相同的。

用公式表達則為：

    $P(X \geq s + t | X \geq s) = P(X \geq t) \text{  for all  } s,t > 0$

```python
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

def exponential_dis(loc=0, scale=1.0):
    """
    指数分布，exponential continuous random variable
    按照定义，指数分布只有一个参数lambda，这里的scale = 1/lambda
    :param loc: 定义域的左端点，相当于将整体分布沿x轴平移loc
    :param scale: lambda的倒数，loc + scale表示该分布的均值，scale^2表示该分布的方差
    :return:
    """
    exp_dis = stats.expon(loc=loc, scale=scale)
    x = np.linspace(exp_dis.ppf(0.000001),
                    exp_dis.ppf(0.999999), 100)
    fig, ax = plt.subplots(1, 1)

    # 直接传入参数
    ax.plot(x, stats.expon.pdf(x, loc=loc, scale=scale), 'r-',
            lw=5, alpha=0.6, label='uniform pdf')

    # 从冻结的均匀分布取值
    ax.plot(x, exp_dis.pdf(x), 'k-',
            lw=2, label='frozen pdf')

    # 计算ppf分别等于0.001, 0.5, 0.999时的x值
    vals = exp_dis.ppf([0.001, 0.5, 0.999])
    print(vals)

    # Check accuracy of cdf and ppf
    print(np.allclose([0.001, 0.5, 0.999], exp_dis.cdf(vals)))

    r = exp_dis.rvs(size=10000)
    ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
    plt.ylabel('Probability')
    plt.title(r'PDF of Exp(0.5)')
    ax.legend(loc='best', frameon=False)
    plt.show()

exponential_dis(loc=0, scale=2)
```

上圖是，$Exp(0,5)$的概率分佈函數圖

下面是對不同參數的指數分佈的概率分佈函數圖的比較：

```python
def diff_exp_dis():
    """
    不同参数下的指数分布
    :return:
    """
    exp_dis_0_5 = stats.expon(scale=0.5)
    exp_dis_1 = stats.expon(scale=1)
    exp_dis_2 = stats.expon(scale=2)

    x1 = np.linspace(exp_dis_0_5.ppf(0.001), exp_dis_0_5.ppf(0.9999), 100)
    x2 = np.linspace(exp_dis_1.ppf(0.001), exp_dis_1.ppf(0.999), 100)
    x3 = np.linspace(exp_dis_2.ppf(0.001), exp_dis_2.ppf(0.99), 100)
    fig, ax = plt.subplots(1, 1)
    ax.plot(x1, exp_dis_0_5.pdf(x1), 'b-', lw=2, label=r'lambda = 2')
    ax.plot(x2, exp_dis_1.pdf(x2), 'g-', lw=2, label='lambda = 1')
    ax.plot(x3, exp_dis_2.pdf(x3), 'r-', lw=2, label='lambda = 0.5')
    plt.ylabel('Probability')
    plt.title(r'PDF of Exponential Distribution')
    ax.legend(loc='best', frameon=False)
    plt.show()

diff_exp_dis()
```

#### 正態分佈（Normal Distribution）

正態分佈，又名高斯分佈（Gaussian Distribution），是一種非常常見的連續概率分佈，經常用在自然和社會科學中表示一種不明的隨機變量。由於中心極限定理的存在，正太分佈也是所有分佈中應用最廣泛的分佈。

##### 定義：

若隨機變量$X$的概率密度符合以下形式，就稱$X$服從參數為$\mu, \sigma$的正態分佈，記做：$X～N(\mu,\sigma^2)$.

    $f_X (x) = \frac{1}{\sqrt{2 \pi } \sigma} \exp \left\{-\frac{(x - \mu)^2}{2 \sigma^2} \right\}, \hspace{20pt} \textrm{for all } x \in \mathbb{R}.$

如果上式公式中$\mu = 0, \sigma = 1$，就叫做標準正態分佈（Standard Normal Distribution），一般記做$Z～N(0,1)$

由於標準正態分佈在統計學中的重要地位，它的累積分佈函數（CDF）有一個專門的表示符號：$\Phi$，一般在統計相關的書籍附錄中的“標準正太分佈函數值表”就是該值與隨機變量的取值之間的對應關係。

```python
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
x = np.linspace(-3,3)
y = stats.norm.cdf(x, loc=0, scale=1)
y1 = stats.norm.pdf(x, loc=0, scale=1)
ax.plot(x,y,'-',label='cdf of standard norm')
ax.plot(x,y1,'-',label='pdf of standard norm')
ax.legend( loc='best',frameon=False)

plt.title(r'Standard Normal Distribution')

plt.show()
```

##### 正態分佈兩個參數含義：
* 當固定$\sigma$，改變$\mu$時，$f(x)$圖形的形狀不變，只是沿著$x$軸做平移變換，因此$\mu$被稱為位置參數（決定了（對稱軸的位置）；
*當固定$\mu$，改變$\sigma$時，$f(x)$圖形的對稱軸不變，形狀改變，$\sigma$越小，圖形越高越瘦;$\sigma$越大，圖形越矮越胖，因此$\sigma$被稱為尺度參數（決定曲線的分散程度）

下面是示例：

```python
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
x = np.linspace(-5,5)
y = stats.norm.pdf(x, loc=0, scale=1)
y1 = stats.norm.pdf(x, loc=2, scale=1)
ax.plot(x,y,'-',label='pdf of norm with mu = 0')
ax.plot(x,y1,'-',label='pdf of norm with mu = 2')
ax.legend(loc='best',frameon=True)

plt.title(r'Normal Distribution')

plt.show()
```

```python
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
x = np.linspace(-5,5)
y = stats.norm.pdf(x, loc=0, scale=1)
y1 = stats.norm.pdf(x, loc=0, scale=2)
ax.plot(x,y,'-',label='pdf of norm with sigma = 1')
ax.plot(x,y1,'-',label='pdf of norm with sigma = 2')
ax.legend(loc='best',frameon=True)

plt.title(r'Normal Distribution')

plt.show()
```

##### 性質：

* $f(x)$關於$x = \mu$對稱；
* 當$x \leq \mu$時，$f(x)$ 時嚴格單調遞增函數；
* $f_max = f(\mu) = \frac{1}{\sqrt{2\pi}\sigma}$;
* 當$X～N(\mu,\sigma^2)$時，$\frac{X - \mu}{\sigma} \sim N(0, 1)$

*利用第四點，我們在計算一般的正態分佈時，可以轉化成標準正態分佈進行計算*

```python
def diff_normal_dis():

    norm_dis_0 = stats.norm(0, 1)  # 标准正态分布
    norm_dis_1 = stats.norm(0, 0.5)
    norm_dis_2 = stats.norm(0, 2)
    norm_dis_3 = stats.norm(2, 2)

    x0 = np.linspace(norm_dis_0.ppf(1e-8), norm_dis_0.ppf(0.99999999), 1000)
    x1 = np.linspace(norm_dis_1.ppf(1e-10), norm_dis_1.ppf(0.9999999999), 1000)
    x2 = np.linspace(norm_dis_2.ppf(1e-6), norm_dis_2.ppf(0.999999), 1000)
    x3 = np.linspace(norm_dis_3.ppf(1e-6), norm_dis_3.ppf(0.999999), 1000)
    fig, ax = plt.subplots(1, 1)
    ax.plot(x0, norm_dis_0.pdf(x0), 'r-', lw=2, label=r'miu=0, sigma=1')
    ax.plot(x1, norm_dis_1.pdf(x1), 'b-', lw=2, label=r'miu=0, sigma=0.5')
    ax.plot(x2, norm_dis_2.pdf(x2), 'g-', lw=2, label=r'miu=0, sigma=2')
    ax.plot(x3, norm_dis_3.pdf(x3), 'y-', lw=2, label=r'miu=2, sigma=2')
    plt.ylabel('Probability')
    plt.title(r'PDF of Normal Distribution')
    ax.legend(loc='best', frameon=False)
    plt.show()

diff_normal_dis()
```

### 隨機變量的數字特徵（Numerical Characteristic）

如果說一個隨機變量的分佈函數（累積分佈函數或概率密度分佈）是對隨機變量最完整，最具體的描述，那麼隨機變量的數字特徵就是對該隨機變量特徵的描述。分佈函數就如同一個人的全身像，而數字特徵就像一個人的局部特寫。

#### 常見的數字特徵：

* 數學期望（Expectation）
* 方差（Variance）
* 矩（Moments）
* 協方差和相關係數（Covariance and Correlative Coefficient ）

前面三個數字特徵都是耽擱隨機變量自身的特徵，第四個數字特徵則是表示兩個隨機變量之間的關係，其他數學特種還有中位數，眾數等等

#### 數學期望（Matematical Expectation）

一個隨機變量$X$的數學期望，簡稱期望，也叫做均值（Mean），記做E(X)。常見於隨機變量的定義中，都直接或間接包含了“期望”這個參數，該參數一般於分佈在座標軸上的位置有關。期望與我們平時說的平均值不多，體現的是隨機變量中的“大碩鼠”的取值情況或趨勢。

在計算中，隨機變量$X$的平均值E(X)並不等於一個具體樣本集$x$的均值E(x)$\Rightarrow$計算一個具體樣本集的均值時，是將所有的值求和然後除以樣本個數，因為此時的$x$已經是一個具體的數列，而不再具有隨機性$\Rightarrow$隨機變量$X$的均值是加權平均數。

例如，一個離散型隨機變量$X$的概率質量分佈列如下：

|X|0|1|2|3|4|
|------|----|----|----|----|----|
|P(X=x)|0.15|0.30|0.25|0.20|0.10|

那麼，根據定義，我們可以算出：$E(X) = \displaystyle \sum_{ i = 1 }^{ n } x_i p_i = 0 \times 0.15 + 1 \times 0.3 + 2 \times 0.25 + 3 \times 0.2 + 4 \times 0.1 = 1.8$；如果我們從該隨機變量中取1個樣本集$x_1 = 1，1，2，4，4$，那麼$E(x_1) = \frac{1 + 1 + 2 + 4 + 4}{5} = 2.4$

此外，正是定義中對期望是否存在給出了明確的定義：在求離散型隨機變量的期望時，需要其和式構成的級數是收斂的；在連續型隨機變量時，也有類似的要求。一個典型的例子：連續型隨機變量「柯西分佈」因為不滿足此條件，所以不具有均值，具體解釋可以參考： Comparing the Cauchy and Gaussian (Normal) density function 和  Why does the Cauchy distribution have no mean ?

##### 期望的性質：

* 設$c$為一個常數，則$E(c) = c$;
* 設$X$是一個隨機變量，$c$是常數，則$E(cX) = cE(X)$;
* 設$X,Y$是兩個隨機變量，則有$E(X + Y) = E(X) + E(Y)$；

將上面三個性質結合起來，則有：$E(aX + bY + c) = aE(X) + bE(Y) + c$，可以推廣到任意有限個隨機變量線性組合的情況；

* 設$X,Y$是相互獨立的兩個隨機變量，則有$E(XY) = E(X)E(Y)$，可以推廣到任意有限個相互獨立的隨機變量之積的情況。

##### 常見分佈的期望

下面這些分佈的期望是指隨機變量的期望，而不是某個隨機變量抽樣得到的樣本集的期望。在離散隨機變量中，數學期望的物理意義是「一維離散質點系的重心坐標“，在連續型隨機變量中，數學期望的物理意義是「一維連續質點系的重心坐標”。

* 0-1 分佈：$X～B(1,p), E(X) = p$;
* 二項分佈：$X～B(n,p), E(X) = np$;
* 泊松分佈：$X～P(\lambda), E(X) = \lambda$;
* 幾何分佈：$X～G(p), E(X) = \frac{1}{p}$;
* 均勻分佈：$X～N(a, b), E(X) = \frac{a+b}{2}$;
* 正態分佈：$X～N(\mu, \sigma^2), E(X) = \mu$;
* 指數分佈，$X～E(\lambda), E(X) = \frac{1}{\lambda}$

##### 樣本均值的計算

在實際的應用中，我們一般都是已知某個分佈的一組樣本，需要求這組樣本的均值。在計算時，定義中的平均值時算術平均值；還有一種是計算幾何平均值，及所有樣本值相乘後開$N$次方，$N$為樣本數。

算術平均值和幾何平均值最大的區別在於：如果樣本中有$0$存在，幾何平均值就等於$0$；如果樣本中不包含$0$，通常算數平均值$\geq$幾何平均值。下面是 $Python$的實現方法

```python
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

## 计算平均值
x = np.arange(1, 11)
print(x)  # [ 1  2  3  4  5  6  7  8  9 10]
mean = np.mean(x)
print(mean)  # 5.5

# 对空值的处理，nan stands for 'Not-A-Number'
x_with_nan = np.hstack((x, np.nan))
print(x_with_nan)  # [  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  nan]
mean2 = np.mean(x_with_nan)
print(mean2)  # nan，直接计算没有结果
mean3 = np.nanmean(x_with_nan)
print(mean3)  # 5.5

## 计算几何平均值
x2 = np.arange(1, 11)
print(x2)  # [ 1  2  3  4  5  6  7  8  9 10]
geometric_mean = stats.gmean(x2)
print(geometric_mean)  # 4.52872868812，几何平均值小于等于算数平均值
```

    [ 1  2  3  4  5  6  7  8  9 10]
    5.5
    [  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  nan]
    nan
    5.5
    [ 1  2  3  4  5  6  7  8  9 10]
    4.52872868812

#### 方差（Variance）

一個隨機變量$X$的方差，刻畫了$X$取值的波動性，是衡量該隨機變量取值分散程度的數字特徵。方差越大，就表示該隨機變量越分散；方差越小，表示該隨機變量越集中。在實際應用中，例如常見的「QC」問題，如果一個工廠的出場的合格評分方差大，說明了優質品和劣質品都比較多，**出品不穩定**；相反，如果方差比較小，說明了合格品比較多，優質品和劣質品較少，**出品穩定**

##### 性質：
1. 設$c$為常數，則$Var(c) = 0$；
2. 設$X$是一個隨機變量，$c$是常數，則$Var(cX) = c^2 Var(X)$；特例，$D(-X) = D(X)$；
3. 設$X, Y$是兩個隨機變量，則有$Var(X + Y) = Var(X) + Var(Y) + 2\cdot tail$，其中，$tail = E[X-E(X)][Y-E(Y)]$. 特別的，如果$X, Y$相互獨立，則$tail = 0$
4. $Var(X) = 0 \Leftrightarrow P(X = c) =1,$ 且$c = E(X)$ ;
5. 當$X, Y$相互獨立時，$Var(XY) = Var(X)Var(Y) + Var(X)[E(Y)]^2 +Var(Y)[E(X)]^2$

還有一個常用的計算方差的公式：$D(X) = E(X^2) - [E(X)]^2$

##### 常見分佈的方差：

* 0-1 分佈：$X～B(1,p), Var(X) = p(1-p)$;
* 二項分佈：$X～B(n,p), Var(X) = np(1-p)$;
* 泊松分佈：$X～P(\lambda), Var(X) = \lambda$;
* 幾何分佈：$X～G(p), Var(X) = \frac{1-p}{p^2}$;
* 均勻分佈：$X～N(a, b), Var(X) = \frac{(b-a)^2}{12}$;
* 正態分佈：$X～N(\mu, \sigma^2), Var(X) = \sigma^2, (\sigma > 0)$;
* 指數分佈，$X～E(\lambda), Var(X) = \frac{1}{\lambda^2}$

##### 樣本方差的計算

就如同計算均值一樣，通常我們的計算都是從某個分佈中抽樣得到的一組樣本的方差，樣本方差一般使用$S^2$表示，按照方差的定義：

    $Var(X) = E{[X - E(X)]^2} = \frac{1}{n} \displaystyle \sum_{i=1}^{n}(X_i - \bar{X})^2$

其中：$\bar{X} = E(X)$。如果直接用上面的公式計算$S^2$，等同於使用樣本的二階中心距。但是樣本的二階中心距並不是隨機變量$X$這個總體分佈的無偏估計，將上式中的$n$換成$n-1$就得到了樣本方差計算公式，這也是總體方差無偏估計。

    $S^2 = \frac{1}{n - 1} \displaystyle \sum_{i=1}^{n}(X_i - \bar{X})^2$

從直觀來說，由於樣本方差中多了一個約束條件 ——樣本的均值時固定的，$E(X) = \bar{X} \Rightarrow $如果已知$n-1$樣本，那麼根據均值可以直接計算出第$n$哥樣本的值，因此自由度比計算總體方差的時候減少了$1$個。

```python
import numpy as np

# 参考
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html

data = np.arange(7, 14)
print(data)  # [ 7  8  9 10 11 12 13]

## 计算方差
# 直接使用样本二阶中心距计算方差，分母为n
var_n = np.var(data)  # 默认，ddof=0
print(var_n) # 4.0
# 使用总体方差的无偏估计计算方差，分母为n-1
var_n_1 = np.var(data, ddof=1)  # 使用ddof设置自由度的偏移量
print(var_n_1) # 4.67

## 计算标准差
std_n = np.std(data, ddof=0)
std_n_minus_1 = np.std(data, ddof=1)  # 使用ddof设置自由度的偏移量
print(std_n, std_n_minus_1)  # 2.0, 2.16
print(std_n**2, std_n_minus_1**2)  # 4.0, 4.67
```

    [ 7  8  9 10 11 12 13]
    4.0
    4.66666666667
    2.0 2.16024689947
    4.0 4.66666666667

#### 矩

矩是一個非常廣泛的概念，期望和方差都是矩的特例。

##### 定義：

* 若$E(X^k), k = 1, 2, \dots $存在，則稱$E(X^k)$為$X$的$k$階原點矩，記做$\alpha_k = E(X^k)$；
* 若$E[X - E(X)]^k, k = 1, 2, \dots$存在，則稱$E[X-E(X)]^k$為$X$的$k$階中心距，記做$\beta_k = E[X-E(X)]^k$

根據定義，期望$E(X)$ 是1階原點矩，方差$D(X)$是2階中心距。需要注意的是，就跟上面提到的一樣，樣本的2屆中心距並不是總體方差的無偏估計，樣本方差$S^2$的時機計算公式中分母為$n-1$，而不是樣本2階中心距中的$n$。

**符號說明**：

* 總體k阶原點矩：$α_k$;
* 總體k阶中心矩：$β_k$;
* 樣本k阶原點矩：$A_k$;
* 樣本k阶中心矩：$B_k$;

#### 協方差（Covariance）

上面介紹了幾種隨機變量的數字特徵都是描述耽擱隨機變量拘捕性質的量，協方擦好和相關係數則是用來度量兩個不同的隨機變量之間的相關程度。

##### 協方差

如上面介紹方差的性質時，第(3)條提到的那樣：

設$X, Y$是兩個隨機變量，則有$ Var(X + Y) = Var(X) + Var(Y) + 2\cdot tail$，其中，$tail = E[X - E(X)][Y - E(Y)].$ 特別的，若$X, Y$相互獨立，那麼$tial = 0$，那麼$tail$不等於$0$，就代表了這兩個隨機變量不相互獨立。$tail$就是$X$與$Y$的協方差。

##### 定義：

數值$E[X-E(Y)][Y-E(Y)]$為隨機變量$X$與$Y$的協方差，記做$Cov(X,Y)$，即：

    $Cov(X, Y) = E{[X - E(X)][Y - E(Y)]}$

此時，$Var(X + Y) = Var(X) + Var(Y) + 2Cov(X,Y)$，協方差$Cov(X, Y)$反映了隨機變量的$X$與$Y$的線性相關性：

* 當$Cov(X,Y0 > 0$時，稱$X$與$Y$正相關；
* 當$Cov(X,Y0 < 0$時，稱$X$與$Y$負相關；
* 當$Cov(X,Y0 = 0$時，稱$X$與$Y$無關；

協方差的計算公式可以簡化成：$Cov(X,Y) = E(XY) - E(X)E(Y)$

##### 相關係數

協方差時有量綱的數字特徵，為了消除其量綱的影響，引入了相關係數，在平時的數據分析中協方差很少出現，先港係數出現的頻率非常高。

    $\rho_{XY} = \frac{Cov(X, Y)}{\sqrt{D(X)D(Y)}}$\

稱為隨機變量$X$與$Y$的相關係數。

##### 相關係數的性質

* $|\rho XY|\leq 1$（相關係數的值位於區間[-1,1]）；
* $|\rho XY| = 1 \Rightarrow$ 存在常數$a,b$使得$P(Y = a+bX)=1$. 特別的，$\rho XY = 1$時，$b > 0$；$\rho = 1$時，$b < 0$. 與協方差，相關係數也是用來表徵兩個隨機變量之間線性關係密切程度的特徵數，有時也稱為「線性相關係數」

#### 樣本均值的期望和方差

設隨機變量$X$的一組樣本為$x$，則樣本的矩陣$\bar{x} = \frac{1}{n} \displaystyle \sum_{i=1}^{n}x_i$。此時的樣本$x$與樣本均值$\bar{x}$都是確定的數值，不具有隨機行。但是，如果我們卻了很多組樣本L：$x^{(1)}, x^{(2)}, ...$那麼這些樣本的均值$\bar{x}^{(1)}, \bar{x}^{(2)}, ...$就可以組成一個新的隨機變量，可以記做$\bar{X}$，每一個樣本均值也可以看作從該隨機變量中抽樣所得。

樣本均值$\bar{X}$這個隨機變量時隨機變量$X$的函數。根據期望和方差的定義，我們可以求出樣本均值的期望和方差。

假設隨機變量$X$的期望和方差分別是：$\mu$和$\sigma^2$

* E($\bar{X}$) = $\mu$，樣本均值的期望與原隨機變量的期望相同；
* Var($\bar{X}$) = $\frac{\sigma^2}{n}$，其中$n$為每次取樣的樣本量，

```python
import numpy as np
from scipy import stats

def mean_and_std_of_sample_mean(ss=[], group_n=100):
    """
    不同大小样本均值的均值以及标准差
    """
    norm_dis = stats.norm(0, 2)  # 定义一个均值为0，标准差为2的正态分布
    for n in ss:
        sample_mean = []  # 收集每次取样的样本均值
        for i in range(group_n):
            sample = norm_dis.rvs(n)  # 取样本量为n的样本
            sample_mean.append(np.mean(sample))  # 计算该组样本的均值
        print(np.std(sample_mean), np.mean(sample_mean))

sample_size = [1, 4, 9, 16, 100]  # 每组试验的样本量
group_num = 10000
mean_and_std_of_sample_mean(ss=sample_size, group_n=group_num)
```

    1.99008474793 -0.0208546895623
    1.00750814281 0.00347718092382
    0.672067720702 0.00687662521186
    0.503784014261 0.00284508641179
    0.20016653808 0.000791586359448

#### 樣本均值的期望和方差

設隨機變量$X$的一組樣本為$x$，則樣本的均值$\bar{x} = \frac{1}{n} \displaystyle \sum_{i=1}^{n}x_i$。此時的樣本$x$與樣本均值$x$都是確定的數值，不具有隨機行。但是，如果我們取了很多組樣本：$x^{(1)}, x^{(2)}, ...$那麼這些樣本的均值$\bar{x}^{(1)}, \bar{x}^{(2)}, ...$就可以組成一個新的隨機變量，可以記做$\bar{X}$，每一個樣本均值也可以看做是從該隨機變量中抽樣所得。

樣本均值$\bar{X}$這個隨機變量$X$的函數。根據期望和方差的定義，我們可以求出樣本均值的期望和方差。假設隨機變量$X$的期望和方差分別為$\mu$和$\sigma^2$
* $E(\bar{X}) = \mu$，樣本均值的期望與原隨機變量的期望相同；
* $D(\bar{X}) = \frac{\sigma^2}{n}$，其中$n$ 為每次取樣的樣本量，這裡的$n$不表示樣本組數，而是單組中的樣本量；樣本組數在這裡並沒有體現。這是因為**$\bar{X}$的随机性是在获取单组样本时体现出来的（即结果的不确定性），跟组数无关（当每组样本获得之后，数据就不在具有随机性了）。由此可见，每次采样的样本量越多，得到的样本均值的方差也越小，也就表示更加准确，但是取样所用的时间和成本也同时增加了。这就需要在准确型和成本之间做一个权衡。

下面用程序做一個測試，測試的是樣本均值的標準差隨著樣本量的變化而發生的變化，如果方差縮小$n$倍，那麼理論上標準差會縮小$\sqrt n$倍。

```python
import numpy as np
from scipy import stats

def mean_and_std_of_sample_mean(ss=[], group_n=100):
    """
    不同大小样本均值的均值以及标准差
    """
    norm_dis = stats.norm(0, 2)  # 定义一个均值为0，标准差为2的正态分布
    for n in ss:
        sample_mean = []  # 收集每次取样的样本均值
        for i in range(group_n):
            sample = norm_dis.rvs(n)  # 取样本量为n的样本
            sample_mean.append(np.mean(sample))  # 计算该组样本的均值
        print(np.std(sample_mean), np.mean(sample_mean))

sample_size = [1, 4, 9, 16, 100]  # 每组试验的样本量
group_num = 10000
mean_and_std_of_sample_mean(ss=sample_size, group_n=group_num)
```

    1.99183803618 0.0461229296359
    1.00674682296 0.0177540329668
    0.668143024892 0.00299211910315
    0.498323040688 -0.00523627140067
    0.201260608929 0.00134588313727

具體的證明過程，可以參考Mean and Variance of Sample Mean

## Chapter Two Statistics

### 大數定理與中心極限定理

這兩個定理可以說是概率論中最重要的兩個定理，也是因為中心極限定理的存在，才使得正態分佈稱為應用最為廣泛的分佈。

#### 大數定理（Law of Large Numbers, LLN）

大數定理可以說是整個數理統計學的一塊基石，最早的大數定理是由伯努利在他的著作中提出並給予證明的。數理統計中包含了兩類問題$\Rightarrow$對於概率$p$的檢驗和估計。大數定律的本事是一類極限定理，它是由概率的統計定義“頻率收斂與概率“引申而來。簡單的說就是$n$個獨立同分佈的隨機變量的觀察值的均值$\bar{X}$依概率收斂與這些隨機變量所屬分佈的理論均值，也就是總體均值。

假設我們現在有兩種大小質地相同的球：紅球a個，白球b個，放入一個盒子，隨機抽出一個球，這個球是紅球的概率$p = \frac{a}{a+b}$。但是，如果我們不清楚$a$和$b$，則無法得出$p$，這時，我們可以反覆的抽球（有放回）。設我們抽了$N$次，發現白球出現了$M$次，則用$\frac{M}{N}$去估計$p$值。這個估計是會有誤差的，但是我們會認為，當$N$越大，則誤差會縮小。

**從現實（實用）的角度去看，概率的統計定義無非是通過試驗去估計時間概率的方法**

##### 定義：

設$X_1, X_2, ..., X_n$是獨立同分佈（i.i.d)的隨機變量，記它們的共喔過年均值為$\mu$。又設它們的方擦好存在並記做$\sigma^2$。則對任意給定的$\varepsilon > 0$，有

    $\displaystyle \lim_{ n \to \infty } P(| \bar{X}_n - \mu| \geq \varepsilon) = 0 \hspace{ 10pt } \ldots (1-1)$

這個式子指出了「當$n$很大時，$\bar{X}_n$接近$\mu$」的確切含義。這裡的“接近”時概率上的嗎，也就是說概率非常小，但還是由一定的概率出現意外情況（例如上式的概率大於$\epsilon$）。只是這樣的可能性越來越小，這樣的收斂型，在概率論中叫做”$\bar{X}_n$依概率收斂與$\mu$“。

下面是用 python 來模擬拋硬幣：

用 random 模塊生成區間$[0,1)$之間的隨機數，如果生成的數小於0.5，就記為硬幣正面朝上，否則幾位硬幣反面朝上。由於`random.random()`生成的數可以看做服從在區間`[0,1)`上的均勻分佈，所以以0.5為界線，隨機生成的數大於0.5或小於0.5的概率應該是相同的（相當於硬幣為均勻的）。這樣就用隨機數模擬了時機拋硬幣試驗。理論上試驗次數越多（拋硬幣次數越多），正反面出現次數之比越接近1。

```python
import random
import matplotlib.pyplot as plt

def flip_plot(minExp, maxExp):
    """
    Assumes minExp and maxExp positive integers; minExp < maxExp
    Plots results of 2**minExp to 2**maxExp coin flips
    """
    # 两个参数的含义，抛硬币的次数为2的minExp次方到2的maxExp次方，
    #也就是一共做了(2**maxExp - 2**minExp)批次实验，每批次重复抛硬币2**n次

    ratios = []
    xAxis = []
    for exp in range(minExp, maxExp + 1):
        xAxis.append(2**exp)
    for numFlips in xAxis:
        numHeads = 0 # 初始化，硬币正面朝上的计数为0
        for n in range(numFlips):
            if random.random() < 0.5:  # random.random()从[0, 1)随机的取出一个数
                numHeads += 1  # 当随机取出的数小于0.5时，正面朝上的计数加1
        numTails = numFlips - numHeads  # 得到本次试验中反面朝上的次数
        ratios.append(numHeads/float(numTails))  #正反面计数的比值
    plt.title('Heads/Tails Ratios')
    plt.xlabel('Number of Flips')
    plt.ylabel('Heads/Tails')
    plt.plot(xAxis, ratios)
    plt.hlines(1, 0, xAxis[-1], linestyles='dashed', colors='r')
    plt.show()

flip_plot(4, 16)
```

#### 中心極限定理（Central Limit Theorem，CLT）

中心極限定理描述的是某種形式變量之和的分佈。

##### 從大數定理倒中心極限定理

> 简单来说，大数定律（LLN）和中心极限定理（CLT）的联系与区别在于：
共同点：都是用来描述独立同分布（i.i.d）的随机变量的和的渐进表现（asymptotic behavior)
区别：首先，它们描述的是在不同的收敛速率（convergence rate）之下的表现，其次LLN前提条件弱一点：$E(X^2)<\infty$ CLT成立条件强一点：$E(X_2)<∞$

摘自知乎：**Detian Deng** 的回答

##### 定理

假設${X_n}$為$i.i.d$的隨機變量序列，具有公共的數學期望$\mu$和方差$\sigma^2$，則$X_1 + \dots + X_n$ 的標準形式$\frac{1}{\sqrt n} \sigma (X_1 + X_2 + \dots X_n - n\mu)$滿足中心極限定理。即，對任意$x\in R$，有：

    $\lim_{n\rightarrow \infty} F_n(x) = \Phi(x)$

其中$F_n(x)$為$\frac{1}{\sqrt n} \sigma (X_1 + X_2 + \dots X_n - n\mu)$的分佈函數，而$\Phi(x)$為標準正態分佈$N(0,1)$的分佈函數，記做：

    $\frac{1}{\sqrt n} \sigma (X_1 + X_2 + \dots X_n - n\mu)  \stackrel{d}{\longrightarrow} N(0,1)$

這個定理說明了：**任何獨立同分佈的隨機變量序列，不論它的分佈是什麼，只要存在有限的方差，那麼它們的標準化部分和都會逐漸近於正態分佈**，這也說明了正態分佈的普遍性。由這個定理，我們可以得到下面這個推論：

設$X_1, \dots,X_n$相互獨立且具有相同的分佈:

$P(X_1 = 1) = 1-P(X_1 = 0)=p, 0<p<1$

則有：

$\frac{X_1, \dots,X_n}{\sqrt{np(1-p)}} \stackrel{d}{\longrightarrow} N(0,1)$

即：

$\lim_{n\rightarrow \infty}\frac{X_1, \dots,X_n}{\sqrt{np(1-p)}} \stackrel{d}{\longrightarrow} N(0,1)$

這就是棣莫弗-拉普拉斯定理，最早的中心極限定理。

題目：

设一考生参加 100 道题的英语标准化考试 (每道题均为有两个备选答案的选择题，有且仅有一个答案是正确的)，每道题他都随机地选择一个答案，假设评分标准为:选对得一分，选错或不选不得分。 试给出该考生最终得分大于等于 50 的概率.

解答：每一題都是一個伯努利分佈，既然是隨機選擇，那麼選擇正確的概率就是$\frac{1}{2}$，100道題，說明這是一個$n = 100$的$n$重伯努利分佈。分數則是這個樣本數據的期望。$X～B(100,0.5)$，通過`python`畫出圖像：

```python
binom_pmf(n=100, p=0.5)
```

```python
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
x = np.linspace(-20,120)
y = stats.norm.pdf(x, loc=50, scale=25)
ax.plot(x,y,'-',label='pdf of norm ')
ax.legend(loc='best',frameon=True)

plt.title(r'Normal Distribution')

binom_pmf(n=100, p=0.5)
plt.show()
```

我們把它們放在一起看實際上，兩服圖已經長的十分相近了。

```python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

"""
Created on Sun Nov 12 08:44:37 2017

@author: Belter
"""

def sampling2pmf(n, dist, t=10000):
    """
    n: sample size for each experiment
    t: how many times do you do experiment, fix in 10000
    dist: frozen distribution
    """
    ber_dist = dist
    sum_of_samples = []
    for i in range(t):
        samples = ber_dist.rvs(size=n)  # 与每次取一个值，取n次效果相同
        sum_of_samples.append(np.sum(samples))
    val, cnt = np.unique(sum_of_samples, return_counts=True)
    pmf = cnt / len(sum_of_samples)
    return val, pmf

def plot(n, dist, subplot, plt_handle):
    """
    :param n: sample size
    :param dist: distribution of each single sample
    :param subplot: location of sub-graph, such as 221, 222, 223, 224
    :param plt_handle: plt object
    :return: plt object
    """
    bins = 10000
    plt = plt_handle
    plt.subplot(subplot)
    mu = n * dist.mean()
    sigma = np.sqrt(n * dist.var())
    samples = sampling2pmf(n=n, dist=dist)
    plt.vlines(samples[0], 0, samples[1],
               colors='g', linestyles='-', lw=3)
    plt.ylabel('Probability')
    plt.title('Sum of bernoulli dist. (n={})'.format(n))
    # normal distribution
    norm_dis = stats.norm(mu, sigma)
    norm_x = np.linspace(mu - 3 * sigma, mu + 3 * sigma, bins)
    pdf1 = norm_dis.pdf(norm_x)
    plt.plot(norm_x, pdf1, 'r--')
    return plt

size = [1, 4, 20, 80, 200, 1000]

# sum of bernoulli distribution
dist_type = 'bern'
bern_para = [0.5]
single_sample_dist = stats.bernoulli(p=bern_para[0])  # 定义一个伯努利分布

# 下面是利用matplotlib画图
plt.figure(1)
plt = plot(n=size[0], dist=single_sample_dist, subplot=321, plt_handle=plt)
plt = plot(n=size[1], dist=single_sample_dist, subplot=322, plt_handle=plt)
plt = plot(n=size[2], dist=single_sample_dist, subplot=323, plt_handle=plt)
plt = plot(n=size[3], dist=single_sample_dist, subplot=324, plt_handle=plt)
plt = plot(n=size[4], dist=single_sample_dist, subplot=325, plt_handle=plt)
plt = plot(n=size[5], dist=single_sample_dist, subplot=326, plt_handle=plt)
plt.tight_layout()
plt.savefig('sum_of_{}_dist.png'.format(dist_type), dpi=200)
```

由上圖可以看出，增加試驗次數和x軸上的分割區間的個數後，隨機變量之和與正態分佈之間的重合度隨著樣本量的增加而增高。這就很容易解釋：對於隨機變量的分佈，抽樣次數（試驗次數）越多，最終畫出來的圖越能代表整個分佈。但是抽樣次數本事卻不影響該分佈的類型和參數。**抽樣不會影響真實分佈，只會影響樣本分佈**

### 三大抽樣分佈

抽樣分佈就是統計量的分佈其特點是不包含位置參數且儘可能多的去包含樣本信息。除了常見的整台分佈之外，還有卡方分佈、t分佈和F分佈為最常見的描述抽樣分佈的分佈函數。我們常說的卡方檢驗、t檢驗和F檢驗和這三個分佈有關。

#### $\chi^2$分佈

##### 定義

設$X_1,X_2,\dots, X_n$ i.i.d.~$N(0,1)$，令$X = \displaystyle \sum^n_{i=1}X^2_i$，則稱$X$是自由度為$n$的$\chi^2$變量，其分佈稱為自由度為$n$的$\chi^2$分佈，記做$X～\chi^2_n$

我們設隨機變量$X$是自由度為$n$的$\chi^2$隨機變量，則其概率密度函數為：

    $\begin{equation}
g_n(x) =
\left\{
             \begin{array}{lr}
             \frac{1}{2^{\frac{n}{2}}\Gamma(\frac{n}{2})} x^{\frac{n}{2}-1} e^{-\frac{x}{2}} \ \ & x > 0 \\
             0 \ \ & x \leq 0
             \end{array}
\right.
\end{equation}$

$\chi^2_n$的密度函數$g_n(x)$形狀如下：

```python
def chi2_distribution(df = 1):
    fig, ax = plt.subplots(1, 1)

    x = np.linspace(stats.chi2.ppf(0.001, df),
                    stats.chi2.ppf(0.999, df), 200)
    ax.plot(x, stats.chi2.pdf(x, df), 'r-',
            lw=5, alpha=0.6, label=r'$\chi^2$ pdf')

    chi2_dis = stats.chi2(df=df)
    ax.plot(x, chi2_dis.pdf(x), 'k-',
            lw=2, label='frozen pdf')
    vals = chi2_dis.ppf([0.001, 0.5, 0.999])
    print(vals)  # [ 2.004  4.     5.996]

    r = chi2_dis.rvs(size=1000)
    ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
    plt.ylabel('Probability')
    plt.title(r'PDF of $\chi^2$({})'.format(df))
    ax.legend(loc='best', frameon=False)
    plt.show()

chi2_distribution(df=10)

```

```python
def diff_chi2_dis():
    """
    不同参数下的卡方分布
    :return:
    """
    # chi2_dis_0_5 = stats.chi2(df=0.5)
    chi2_dis_1 = stats.chi2(df=1)
    chi2_dis_4 = stats.chi2(df=4)
    chi2_dis_10 = stats.chi2(df=10)
    chi2_dis_20 = stats.chi2(df=20)

    # x1 = np.linspace(chi2_dis_0_5.ppf(0.01), chi2_dis_0_5.ppf(0.99), 100)
    x2 = np.linspace(chi2_dis_1.ppf(0.65), chi2_dis_1.ppf(0.9999999), 100)
    x3 = np.linspace(chi2_dis_4.ppf(0.000001), chi2_dis_4.ppf(0.999999), 100)
    x4 = np.linspace(chi2_dis_10.ppf(0.000001), chi2_dis_10.ppf(0.99999), 100)
    x5 = np.linspace(chi2_dis_20.ppf(0.00000001), chi2_dis_20.ppf(0.9999), 100)
    fig, ax = plt.subplots(1, 1)
    # ax.plot(x1, chi2_dis_0_5.pdf(x1), 'b-', lw=2, label=r'df = 0.5')
    ax.plot(x2, chi2_dis_1.pdf(x2), 'g-', lw=2, label='df = 1')
    ax.plot(x3, chi2_dis_4.pdf(x3), 'r-', lw=2, label='df = 4')
    ax.plot(x4, chi2_dis_10.pdf(x4), 'b-', lw=2, label='df = 10')
    ax.plot(x5, chi2_dis_20.pdf(x5), 'y-', lw=2, label='df = 20')
    plt.ylabel('Probability')
    plt.title(r'PDF of $\chi^2$ Distribution')
    ax.legend(loc='best', frameon=False)
    plt.show()

diff_chi2_dis()
```

通過上圖可以看出，當自由度df等於1時，函數突襲那個呈現單調遞減的趨勢；當df大於等於3後，呈現先增後減的缺失。從定義中得出，$df \geq 0$

#### t分佈

t分佈又名「學生t分佈（Student's t-distribution），用於根據小樣本來估計呈正態分佈且方差位置的總體的均值。如果總體方差已知（例如在樣本數量足夠多時），則應該用正態分佈來估計總體均值。

##### 定義：

設隨機變量$X～N(0,1),Y～\chi^2_n$，且$X$和$Y$獨立，則稱：

    $T = \frac{X}{\sqrt{Y/n}}$

為自由度為$n$的$t$變量，其分佈稱為由為$n$的t分佈，記做$T～t_n$

設隨機變量$T～t_n$，則其密度函數為：

    $t_n(x) = \frac{\Gamma(\frac{n+1}{2})}{\Gamma(\frac{n}{2}\sqrt{n\pi}} (1 + \frac{x^2}{n})^{-\frac{n+1}{2}}, \ -\infty < x < \infty$

```python
def diff_t_dis():
    """
    不同参数下的t分布
    :return:
    """
    norm_dis = stats.norm()
    t_dis_1 = stats.t(df=1)
    t_dis_4 = stats.t(df=4)
    t_dis_10 = stats.t(df=10)
    t_dis_20 = stats.t(df=20)

    x1 = np.linspace(norm_dis.ppf(0.000001), norm_dis.ppf(0.999999), 1000)
    x2 = np.linspace(t_dis_1.ppf(0.04), t_dis_1.ppf(0.96), 1000)
    x3 = np.linspace(t_dis_20.ppf(0.001), t_dis_20.ppf(0.999), 1000)

    fig, ax = plt.subplots(1, 1)
    ax.plot(x1, norm_dis.pdf(x1), '--', lw=2, label=r'N(0, 1)')
    ax.plot(x2, t_dis_1.pdf(x2), 'b-', lw=2, label='t(1)')
    ax.plot(x3, t_dis_20.pdf(x3), 'y-', lw=2, label='t(20)')

    plt.ylabel('Probability')
    plt.title(r'PDF of t Distribution')
    ax.legend(loc='best', frameon=False)
    plt.show()

diff_t_dis()
```

$t_n$的密度函數與標準正態分佈$N(0,1)$密度很相似，他們都是關於原點對稱，單峰的偶函數，在$x=0$處達到極大，但$t_n$的峰值低於$N(0,1)$的峰值，$t_n$的密度函數圍捕都要比$N(0,1)$的兩側尾部促一些。容易證明：$\lim_{n\rightarrow \infty}t_n(x) = \varphi (x)$

#### F 分佈
在概率論和統計學中，F-分佈（F-Distribution）是一種連續概率分佈，被廣泛應用於死然比率檢驗。

設隨機變量$X～\chi^2_m$，$Y～\chi^2_n$，且$X$ 和 $Y$ 獨立，則稱：

    $F=\frac{X/m}{Y/n}$

為自由度分別為$m$和$n$的$F$變量，其分佈稱為自由度分別是$m$和$n$的F分佈，記做$F～F_{m,n}$

若隨機變量$Z～F_{m,n}$，則其密度函數為：

    $\begin{equation}
f_{m,n}(x) =
\left\{
             \begin{array}{lr}
             \frac{\Gamma(\frac{m+n}{2}\Gamma(\frac{n}{2})\Gamma(\frac{m}{2})}m^{\frac{m}{2}} n^{\frac{n}{2}} x {\frac{m}{2} - 1}(n+mx)^{-\frac{m+n}{2}}, \ & x>0 \\
             0 \ \ & elsewhere
             \end{array}
\right.
\end{equation}$

```python
def diff_f_dis():
    """
    不同参数下的F分布
    :return:
    """
#    f_dis_0_5 = stats.f(dfn=10, dfd=1)
    f_dis_1_30 = stats.f(dfn=1, dfd=30)
    f_dis_30_5 = stats.f(dfn=30, dfd=5)
    f_dis_30_30 = stats.f(dfn=30, dfd=30)
    f_dis_30_100 = stats.f(dfn=30, dfd=100)
    f_dis_100_100 = stats.f(dfn=100, dfd=100)

#    x1 = np.linspace(f_dis_0_5.ppf(0.01), f_dis_0_5.ppf(0.99), 100)
    x2 = np.linspace(f_dis_1_30.ppf(0.2), f_dis_1_30.ppf(0.99), 100)
    x3 = np.linspace(f_dis_30_5.ppf(0.00001), f_dis_30_5.ppf(0.99), 100)
    x4 = np.linspace(f_dis_30_30.ppf(0.00001), f_dis_30_30.ppf(0.999), 100)
    x6 = np.linspace(f_dis_30_100.ppf(0.0001), f_dis_30_100.ppf(0.999), 100)
    x5 = np.linspace(f_dis_100_100.ppf(0.0001), f_dis_100_100.ppf(0.9999), 100)
    fig, ax = plt.subplots(1, 1, figsize=(20, 10))
#    ax.plot(x1, f_dis_0_5.pdf(x1), 'b-', lw=2, label=r'F(0.5, 0.5)')
    ax.plot(x2, f_dis_1_30.pdf(x2), 'g-', lw=2, label='F(1, 30)')
    ax.plot(x3, f_dis_30_5.pdf(x3), 'r-', lw=2, label='F(30, 5)')
    ax.plot(x4, f_dis_30_30.pdf(x4), 'm-', lw=2, label='F(30, 30)')
    ax.plot(x6, f_dis_30_100.pdf(x6), 'c-', lw=2, label='F(30, 100)')
    ax.plot(x5, f_dis_100_100.pdf(x5), 'y-', lw=2, label='F(100, 100)')

    plt.ylabel('Probability')
    plt.title(r'PDF of f Distribution')
    ax.legend(loc='best', frameon=False)
    plt.savefig('f_diff_pdf.png', dip=500)
    plt.show()

diff_f_dis()
```

F 變量具有如下**性質**：
1. 若$Z～F_{m,n}$，則$1/Z～F_{n,m}$

2. 若$T～t_n$，則$T^2～F_{1,n}$

3. $F_{m,n}(1-\alpha) = 1/F_{n,m}(\alpha)$

### 正態總體樣本均值和樣本方差的分佈

為了方便討論正態總題樣本均值和樣本方差的分佈，我們先給出正態隨機變量的線性函數的分佈。

#### 正態變量線性函數的分佈

設隨機變量$X_1,\dots,X_n \ i.i.d.～N(a,\sigma^2), c_1,c_2,\dots,c_n$為常數，則有

    $T = \displaystyle \sum^n_{k=1}c_k X_k ～N(a \sum^n_{k=1}c_k, simga^2\sum^n_{k=1}c_k^2)$

特別的，當$c_1 = \dots = c_n = \frac{1}{n}$，即：$T = \frac{1}{n} \displaystyle \sum^n_{i=1}X_i = \bar{X}$時，有

    $\bar{X}～N(a,\sigma^2/n)$

#### 正態分佈樣本均值和樣本方差的分佈

設$X_1,\dots,X_n \ i.i.d.～N(\mu,\sigma^2),\bar{X} = \frac{1}{n} \displaystyle \sum^n_{i=1}X_i$ 和 樣本方差，則有

1. $\bar{X}～N(a,\frac{1}{n}\sigma^2)$;
2. $(n-1)S^2/sigma^2～\chi^2_{n-1}$;
3. $\bar{X}$和$S^2$獨立.

### 正態分佈（Normal Distribution）

在生活中，我們經常會用到正態分佈，這是一個墳場常見的連續概率分佈（Continuous probability distribution)，這是因為 CLT 的存在(Central Limited Theorem)。

#### 定義
如果一個隨機變量(Random Variable) $X$ 服從一個位置參數為$\mu$， 尺度參數為 $\sigma$ 的正態分佈，那麼我們記做：

$$ X \sim N(\mu, \sigma^2)$$

她的概率密度函數(PDF:Probability Density Function):

$$f(x) = \frac{1}{\sigma^2 \sqrt{2\pi}} e^ {-\frac{(x - \mu)^2}{2\sigma^2}}$$

在正態分佈中，她的 expectation 等於她的位置參數，決定了分佈曲線的中心位置；其方差 $\sigma^2$ 則決定了尺度、決定了分佈的幅度：「高矮胖瘦」
常態分布的機率密度函數曲線呈鐘形，因此人們又經常稱之為鐘形曲線（类似于寺庙里的大钟，因此得名）。我們通常所說的標準常態分布是位置參數
$\mu =0$，尺度參數 $\sigma^2 = 1$的正態分佈。

```python
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
x = np.linspace(-5,5)
y_1 = stats.norm.pdf(x, loc = 0, scale = 1) #loc
y_2 = stats.norm.pdf(x, loc = 3, scale = 1)
y_3 = stats.norm.pdf(x, loc = 0, scale = 3)
ax.plot(x,y_1,'-',label='pdf of norm,\n mu = 0, sd = 1 ')
ax.plot(x,y_2,'-',label='pdf of norm,\n mu = 3, sd = 1 ')
ax.plot(x,y_3,'-',label='pdf of norm,\n mu = 0, sd = 3 ')
ax.legend(loc='best',frameon=True)

plt.title(r'Normal Distribution')

plt.show()
```

我們需要證明 $n(x;\mu,\sigma)$ 的確是一個分佈密度：
* 需要證明$n(x;\mu,\sigma) > 0$ 對 $\forall x \in (-\infty,+\infty)$ 成立
* 求積分：$\displaystyle \int_{-\infty}^{+\infty} n(x;\mu, \sigma)\ dx = \frac{1}{\sqrt{2\pi}\sigma} \int_{-\infty}^{+\infty} exp\left[-\frac{1}{2\sigma^2} (x - \mu)^2\right] dx$

*這裡，證明過程詳見（方開泰教授）《統計分佈》p102 - 103*

#### 性質

正態分佈有許多非常好的性質，這裡僅列出一些基本的性質：

##### 性質一：
* $n(x;\mu, \sigma)$ 的圖形如上所示，它很像一個鐘，它是一個單峰分佈(Unimodal Distribution)，峰值在 $x = \mu$， 這是因為 $e^{-x^2}$ 在 $x = 0$ 是達到最大，所以，$n(x;\mu, \sigma)$ 在 $ x = \mu$ 處達到最大值，從而她的眾數：$\mu$；
* 圖形關於 $x = \mu$ 對稱；
* $y = 0$ 是 $f(x) / p(x)$ 的漸近線(Asymptote)；

#### 性質二： 歸一化（Normallization）

**若 $X \sim N(\mu, \sigma^2)$， 則 $Z = (X - \mu)/\sigma \sim N(0,1)$. 反之，如果 $Z \sim N(0,1)，則 X = \mu + \sigma Z \sim N(\mu, \sigma^2)$**

**證明**：若 $X \sim N(\mu, \sigma^2)$， 則對一切 $a < b$有：

$\begin{align*}
   P(a < Z < b) &= P(a < \frac{X - \mu}{\sigma} < b) \\
                &= P(\mu + \sigma a < X < \mu + \sigma b) \\
                &= \int_{\mu + \sigma a}^{\mu + \sigma b} \frac{1}{\sqrt{2 \pi}\sigma} exp\left[-\frac{1}{2\sigma^2}(x - \mu)^2\right] \ dx \text{Let $t = \frac{x - \mu}{\sigma}$} \\
                &= \int_{a}^{b} \frac{1}{\sqrt{2\pi}}exp\left[-\frac{1}{2}t^2\right] dt\\
    \end{align*}$

這表明了 $Z \sim N(0,1)$, 其逆命題的證明正好是上面推倒的逆序。

$\Phi = (x;0,1) \ Z ～ N(\frac{x - \mu}{\sigma}; 0,1)$

歸一化的好處是我們只需要研究$\Phi(x)$ 就足夠了，$\Phi(x)$有如下性質：
* $\Phi(0) = \frac{1}{2}, \Phi(x)$ 有兩條漸近線 $y = 0$ 和 $y = 1$. 從而， $\Phi(x)$ 的中位數是 $x = 0$
* $\Phi(-x) = 1 - \Phi(x)$

##### 性質三：可加性 (additivity）
**若$X_1 \sim N(\mu_1, \sigma_1^2)$ 與 $x_2 \sim N(\mu_2, \sigma_2^2)$獨立，則**：
$$X_1 + X_2 \sim N(\mu_1 + \mu_2, \sigma_1^2 + \sigma_2^2)$$

這個性質可以推廣到多個隨機變量的情況：

$X = \{X_1, X_2, X_3, \dots, X_n\}$, 則，$\bar{X} = \frac{1}{n}(X_1 + \dots + X_n)$，對於每一個隨機變量：$X_i \sim N(\mu_i, \sigma_i^2)$,則：
$$\bar{X} = \frac{1}{n}(X_1 + \dots + X_n) \sim N(\mu, \frac{\sigma^2}{n})$$

### 對數正態分佈(logrithm-Normal Distribution)
**對數正態分佈**是對數為正態分佈的任意隨機變量的概率分佈；在地址勘探中，岩石的某種化學成分（用$X$表示），它的對數服從正態分佈，所以得名對數正態分佈。

#### 定義
設$X$是取值為正數的隨機變量，若$log(X) \sim N(\mu, \sigma^2)$，則稱$X$服從對數正態分佈，並記作：$X \sim LN(\mu, \sigma^2)$

*這裡的對數是以自然對數$e$為底的，一般記作 $ln$*

```python
from scipy.stats import lognorm
import numpy as np
import matplotlib.pyplot as plot

fig, ax = plt.subplots(1, 1)
s = 1
mean, var, skew, kurt = lognorm.stats(s, moments='mvsk')
x = np.linspace(lognorm.ppf(0.01, s),
                lognorm.ppf(0.99, s), 100)
ax.plot(x, lognorm.pdf(x, s),
       'r-', lw=5, alpha=0.6, label='lognorm pdf')
rv = lognorm(s)
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
vals = lognorm.ppf([0.001, 0.5, 0.999], s)
np.allclose([0.001, 0.5, 0.999], lognorm.cdf(vals, s))
r = lognorm.rvs(s, size=1000)
ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()
```

$\begin{equation}
f_X(x) = \left\{
             \begin{array}{lr}
            \frac{1}{\sqrt{2\pi}\sigma x} exp\left[-\frac{1}{2\sigma^2}(ln(x) - \mu)^2\right] \ \ &\text{if $x > 0$}\\
            0 \ \ &\text{if $x \leq 0$} \\
             \end{array}
\right.
\end{equation}$

#### 性質
為了方便討論，我們就用 $ln(x;\mu,\sigma^2)$ 表示上式子。

*因為$X$取了自然對數後，自然的，不再是對稱的了，圖如上*

##### 性質一
由上面的PDF可以看出，在$ln(x) = \mu$或者$x = e^{\mu}$時，取得極大值，即分佈的眾數為$e^{\mu}$

##### 性質二
跟正態分佈同樣的是，對數正態分佈也具有可加性.

#### 例題：
若一直某種花崗岩中的$Fe_2O_3$（三氧化二鐵）的含量服從對數分佈：$LN(\mu, \sigma^2)$今天從岩石樣本中測的$Fe_2O_3$的含量分別為：

$$5.98, 3.13, 6.75, 4.60, 10.31, 4.78, 6.15, 3.09, 0.84, 1.07$$

希望知道$Fe_2O_3$的含量落在$(3,9)$的概率。

解題：
若$X\sim LN(\mu, \sigma^2)$，則 $Y = ln(X) \sim N(\mu,\sigma^2)$,可以用正態分佈來估計$\mu,\sigma^2$:
$$ Y = [1.78842057,  1.141033,    1.9095425,   1.5260563,   2.3331143,   1.56444055,
  1.81645208,  1.12817109, -0.17435339,  0.06765865]$$

$\mu = \bar{Y} = 1.310, \ \ \hat{\sigma^2} = 0.646, \ \ \hat{\sigma^2} = 0.804$

```python
from math import log
x = np.array([5.98, 3.13, 6.75, 4.60, 10.31, 4.78, 6.15, 3.09, 0.84, 1.07], dtype=np.float32)
log_x = np.log(x)
mean = np.mean(log_x)
var = np.var(log_x, ddof = 1)
sd = np.std(log_x, ddof = 1)
print(log_x,'\n',mean,'\n',sd)
# ddof means delta degree of freedom
```

    [ 1.7884206   1.141033    1.9095426   1.5260563   2.3331144   1.5644406
      1.8164521   1.1281711  -0.17435342  0.0676587 ]
     1.3100536
     0.8035576

```python
from math import exp
from scipy import stats

def lognorm_cdf(x, mu, sigma):
    shape  = sigma
    loc    = 0
    scale  = exp(mu)
    return stats.lognorm.cdf(x, shape, loc, scale)

x_1 = 3
x_2 = 9
mu     = mean
sigma  = sd
p_1      = lognorm_cdf(x_1, mu, sigma)  #yields the expected 0.74341
p_2      = lognorm_cdf(x_2, mu, sigma)
print("The probability that drop in 3 to 9 is",format((p_2 - p_1) * 100, '.5g'),"%")
```

    The probability that drop in 3 to 9 is 46.899 %

## Discrete Distribution

通常的，我們將隨機變量分為兩類：連續隨機變量和離散隨機變量，在這裏我們首先介紹由離散隨機變量構成的離散型分佈：兩點分佈、二項分佈、泊松分佈、超幾何分佈、幾何分佈、負二項分佈等等，我們將會介紹他們的基本性質。

### 兩點分佈 (Bernoulli Distirubtion)

也被稱為「伯努利分佈」或者「0-1分佈」。這個分佈是指：若「伯努利實驗」成功，則變量取值為$1$，反之，則記為$0$。所以我們將其成功的概率記為$p, \ \ p \in (0,1)$，失敗的概率為$q = (1 - p)$。

#### 伯努利實驗 (Bernoulli trail)
這個實驗是指單詞實驗中，這個事件的結果是兩個可能性結果中的一個。這樣的事件都可以表達成「是」或者「否」(Yes or No)：
* 拋起一個硬幣，落下時是正面還是反面？
* 生下一個孩子，是男孩還是女孩（不考慮特殊情況）？
* etc.

#### 性質

任意的兩點分佈，均可以變換成如下標準概型：

$\begin{align*}
    \begin{pmatrix}
        0 & 1 \\
        q & p
    \end{pmatrix}
    , \
    p + q = 1
 \end{align*}$

* 其概率質量函數(probability mass function)為：
    $$ f_X(x) = p^x(1-p)^x $$
* 其期望值（可以通過原始矩(moments)進行證明）為：
    $$\displaystyle E(X) = \sum_{i = 0}^1 x_i f_X(x) = 0 + p = p$$
* 其方差值（同樣可以通過矩進行證明）為：
    $$\displaystyle Var(X) = \sum_{i = 0}^1 x_i - E(X)^2 f_X(x) = p \times q = p \times (p - 1)$$

### 二項分佈

假設我們有五個小孩，根據遺傳學的研究發現生男孩的概率是$p = 0.5116$，我們需要猜測三男兩女的概率，這有幾種可能？**排列組合問題**：$\binom{5}{3} p^3 (1-p)^2$，其中 $p$ 是生男孩的概率，$(1 - p)$就是生女孩的概率。

一般的，若我們進行了$n$次獨立實驗，每次實驗只有兩個可能的結果（生男「事件：A」還是生女「事件：非A」），且$p = P(A), \ q = P(A^C) $，$p + q = 1, \ p \in (0,1)$，用 $X$ 來表示這$n$次實驗中$A$發生的次數：

$$P(X = m) = C^m_n p^m q^{n-m}, \ \ m = 0,1,\dots,n,$$

```python
import numpy as np
from scipy.stats import binom
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
n, p = 5, 0.5116
mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
x = np.arange(binom.ppf(0.01, n, p),
              binom.ppf(0.99, n, p))
ax.plot(x, binom.pmf(x, n, p), 'bo', ms=8, label='binom pmf')
ax.vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)
rv = binom(n, p)
ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-', lw=1,
        label='frozen pmf')
ax.legend(loc='best', frameon=False)
plt.show()
```

```python
import numpy as np
from scipy.stats import binom
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
n, p = 5, 0.5116
x = np.arange(5)
y = binom.pmf(x,n,p)
ax.plot(x,y,'bo')
ax.vlines(x, 0, binom.pmf(x, n, p), colors='b', lw=5, alpha=0.5)
plt.show()
```

#### 性質

為了方便討論，我們把二項分佈簡單的記做：$b(m;n,p)$

##### 性質一
$\begin{align*}
&b(m;n,p) > 0 , \ \ m = 0,1,\dots, n: \\
&\sum_{m=0}^n b(m;n,p)  = \sum_{m=0}^n C^m_n p^m (1-p)^{n-m} = (p + q)^n = 1 \\
\end{align*}$

#### 性質二

若 $p = 0.5$，則二項分佈是對稱的；若$p \neq 0.5$ 則不是對稱的，且$n$越大越明顯。下圖便是對比，三條線：「樣本量一樣，概率不同」做對比；「樣本量不同，概率相同」做對比。

```python
import numpy as np
from scipy.stats import binom
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)

n , p = 10, 0.5
n_1, p_1 = 5, 0.70
n_2, p_2 = 10, 0.70

x = np.arange(n + 1)
y = binom.pmf(x,n,p)
ax.plot(x,y,'co', label = "n = 10, p = 0.5")
ax.vlines(x, 0, y, colors='c', lw=5, alpha=0.5)

x_1 = np.arange(n_1 + 1)
y_1 = binom.pmf(x_1,n_1,p_1)
ax.plot(x_1,y_1,'bo', label = "n = 5, p = 0.70")
ax.vlines(x_1, 0, y_1, colors='b', lw=5, alpha=0.5)

x_2 = np.arange(n_2 + 1)
y_2 = binom.pmf(x_2,n_2,p_2)
ax.plot(x_2,y_2,'ro', label = "n = 10, p = 0.70")
ax.vlines(x_2, 0, y_2, colors='r', lw=5, alpha=0.5)

ax.legend(loc='best', frameon=False)
plt.show()
```

#### 性質三
二項分佈$b(m;n,p)$的均值、方差、便準差分別為：
$$ \left\{
\begin{aligned}
E(X) &=& np \\
Var(X) &=& npq \\
sd(X) &=& \sqrt{npq} \\
\end{aligned}
\right.
$$

#### 性質四

* 二項分佈可以用不完全$\beta$函數(Normalized Beta Distribution) 來表示：在 Bayesian Inference 裡，$\beta$函數可以作為二項分佈的unconjugated prior，這個會留在 Bayesian Analysis 裡講，敬請關注；
* 二項分佈有一個近似計算的方法：(Stirling Formula) 當$m, n$和 $m - np$都比較大的時候，我們可以使用泊松分佈去估計二項分佈，具體證明詳見：《統計分佈》（方開泰，王元）p59 - 61

### 泊松分佈(Poisson Distribution)

泊松分佈適合於描述單位時間內隨機時間發生的次數的分佈。比如說：某交換台在一段時間內所接收到的呼喚次數、某個公交車站在一個固定時間內來到的乘客數量$\dots$

泊松分佈的概率質量函數為：

$$P(X = k) = \frac{e^{-\lambda}\lambda^k}{k!}$$

泊松分佈的參數$\lambda$是單位時間（或者單位面積）內隨機事件的平均發生率。

#### 性質

為了方便敘述，我們記做 $\displaystyle p(k;\lambda) = \frac{e^\lambda \lambda^k}{k!}, \ \ P(x;\lambda) = \sum_{k=0}^{|x|}p(k;\lambda), \ k = 0,1,2,\dots,n,$

##### 性質一
$\begin{align*}
&p(k; \lambda) > 0 , \ \ k = 0,1,2, \dots, \\
&\sum_{k=0}^{\infty} p(k;\lambda) = e^{-\lambda} \sum_{k = 0}^{\infty} \frac{\lambda^k}{k!} = e^{-\lambda} e^{\lambda} = 1
\end{align*}$

##### 性質二

當$k < \lambda$時， $p(k, \lambda) > p(k -1; \lambda)$;$p(k, \lambda) < p(k -1; \lambda)$; 如果$\lambda$ 不是整數，則$p(k;\lambda)$，在 $k = [\lambda] \equiv k_0$處達到極大值，這裡$[\lambda]$為不超過$\lambda$的最大證書，如果$\lambda$為整數，則$p(k;\lambda)$在$k = \lambda$在$k = \lambda$及$ k = \lambda - 1$處同時達到極大值。

```python
from scipy import stats
mu, k = 2, 10
x = np.arange(0, k + 1, 1)

pmf_poisson = stats.poisson.pmf(x, mu)

plt.plot(x, pmf_poisson, 'bo')
plt.vlines(x,0,pmf_poisson)
plt.vlines(x, 0, pmf_poisson, colors='b', lw=5, alpha=0.5)
plt.xlabel("there are 1000 accident")
plt.ylabel('probability')
plt.title('poisson probability: mean = %i'%mu)

plt.show()
```

#### 性質三

泊松分佈是非對稱的，當$\lambda$越來越大時非對稱性越明顯，是當$n$增大時，非對稱性也會太明顯。

$\begin{align*}
   E(X) &=& \lambda \\
   Var(X) &=& \lambda \\
   sd(X) &=& \sqrt{\lambda} \\
\end{align*}$

```python
from scipy import stats
fig, ax = plt.subplots(1, 2)
mu, k = 2, 5
x = np.arange(0, k + 1, 1)

pmf_poisson = stats.poisson.pmf(x, mu)

plt.subplot(221)
plt.plot(x, pmf_poisson, 'bo')
plt.vlines(x,0,pmf_poisson)
plt.vlines(x, 0, pmf_poisson, colors='b', lw=5, alpha=0.5)
plt.xlabel("there are 1000 accident")
plt.ylabel('probability')
plt.title('poisson probability: mean = %i'%mu)

plt.subplot(222)
mu_1, k_1 = 10, 5
x_1 = np.arange(0, k_1 + 1, 1)

pmf_poisson_1 = stats.poisson.pmf(x_1, mu_1)

plt.plot(x_1, pmf_poisson_1, 'ro')
plt.vlines(x_1,0, pmf_poisson_1)
plt.vlines(x_1, 0, pmf_poisson_1, colors='r', lw=5, alpha=0.5)
plt.xlabel("there are 1000 accident")
plt.ylabel('probability')
plt.title('poisson probability: mean = %i'%mu_1)

plt.show()
```

#### 性質四

* 若$X_1, \dots, X_n$是獨立同分佈的隨機變量，則 $X_1\sim P(\lambda)$等價於 $\sum_{i=1}^n X_i \sim P(n\lambda)$.
* 設$X_1, \dots, X_n$相互獨立，且$X_i \sim P(\lambda_i), i = 1,2,\dots,n$, 則$\sum_{i=1}^n X_i \sim P(\lambda)$,其中$\lambda = \lambda_1 + \dots \lambda_n$

### 超幾何分佈 (Hypergeometric Distirbution)

**超幾何分佈**描述了由有限物件中抽出$n$個物件，成功抽出制定種類的物件的個數（不歸還（without replacement））。例如，在由$N$個紅球之中，其中有$K$個藍球。超幾何分佈描述了在$N$個樣本中抽出$n$個，其中$k$個是籃球的概率：

$$f(k;n,K,N) = \frac{\binom{K}{k} \binom{N - K}{n - k}}{\binom{N}{n}}$$

其實，很容易看出這氣勢就是一個「排列」問題：從$N$個紅球中抽出$k$個籃球的可能性有$\binom{k}{K}$種，$(n - k)$件紅球從$N - K$個紅球中抽取的一切可能性是$\binom{n - k}{N - K}$種， 所抽出的$n$個球中出現的次序總共有$n!$種可能的排列，於是所求的概率為：

$$P(X = k) = \frac{\binom{K}{k} \binom{N - K}{n - k}}{\binom{N}{n}}$$

所以，我們可以給出一個新定義：若隨機變量$X$的取值是閉區間：$[max(0, M + n - N), min(M,n)]$內的一切整數， 且$X = k$的概率應該是P(X = k)$，則響應的分佈叫做超幾何分佈，記做$X\sim H(M, N, n)$.

```python
from scipy.stats import hypergeom
import matplotlib.pyplot as plt

[M, n, N] = [20, 7, 12]
rv = hypergeom(M, n, N)
x = np.arange(0, n+1)
pmf_dogs = rv.pmf(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, pmf_dogs, 'bo')
ax.vlines(x, 0, pmf_dogs, lw=2)
ax.set_xlabel('# of dogs in our group of chosen animals')
ax.set_ylabel('hypergeom PMF')
plt.show()
```

### 負二項分佈 (Negative Binormial Distribution)

負二項分佈描述在一系列獨立筒分佈的伯努利實驗中，失敗次數達到指定次數（記為$r$）時臣工次數的離散概率分佈。比如，如果我們定義擲骰子隨機變量$x$值為$x = 1$時為失敗，所以$x \neq 1$為成功，這時我們反覆擲骰子知道$1$出現三次，此時非$1$數字出現的概率分佈為負二項分佈。

負二項分佈也被稱為帕斯卡分佈(Pascal Distribution)，時幾何分佈的直接推廣，正如幾何分佈可以用伯努利實驗來定義一樣，負二項分佈也可用伯努利實驗來定義。

顯然，事件$X = k$等價於“第$k$次試驗出現成功，前面$k - 1$實驗中成功“$r - 1$次”故：

$$P(X = k) = p C_{k - 1}^{r - 1} p^{r - 1} q^{k-r} = C_{k - 1}^{r - 1} p^rq^{k - r}, \ \ k = r, r + 1, \dots$$

令$Y= X - r$， 則$Y$的分佈的：

$$P(Y = k) = P(X = k + r) = C_{k + r - 1}^k p^r q^k, \ \ k = 0,1, \dots$$

通常我們稱它為「等待時間分佈」， 記做$Y \sim NB(r, p)$

jupyterfiles/Use PY in Advanced Statistics .ipynb


# Purpose

This notebook tracks development of a wrapper for the kameleon software suite to support legacy ccmc models until python 3 model readers become available.

This notebook should be executed from a python3 environment with kamodo installed.

```python
!python --version
```

    Python 3.7.3

```python
from kamodo.readers._kameleon_kamodo import Kameleon
```

```python
# may need to specify the full path to cdf, else file doesn't load correctly
fname = '/Users/apembrok/Work/Kameleon_Sample_Data/LFM/Nov2015.LFM.S1-OF_mhd_2002-09-30T03-16-00Z.cdf'

# python_path should point to a python2 executeable with kameleon installed
python_path = '/Users/apembrok/miniconda2/envs/klive/bin/python'
kameleon = Kameleon(fname, python_path, 'rho', 'p', 'bx','by','bz')
```

    /Users/apembrok/Work/Kameleon_Sample_Data/LFM/Nov2015.LFM.S1-OF_mhd_2002-09-30T03-16-00Z.cdf opened

```python
kameleon
```

\begin{equation}\rho{\left(\vec{x} \right)} [amu/cm^3] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}p{\left(\vec{x} \right)} [nPa] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bx}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{by}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bz}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}

```python
from kamodo import gridify
import numpy as np
points = np.arange(12*3).reshape((-1,3))
```

```python
kameleon.rho(points)
```

    array([ 1.75048208e+00,  4.82881117e+00,  5.63864784e+01,  1.87258148e+01,
            1.88226109e+01,  1.85908566e+01,  1.87104950e+01,  1.86995926e+01,
            1.86710930e+01,  1.86786823e+01, -1.09951163e+12, -1.09951163e+12])

```python
kameleon.bx([[-30, 0, 0], [-20, 0, 0]])
```

    [-14.527422904968262, -11.133100509643555]

```python
kameleon
```

\begin{equation}\rho{\left(\vec{x} \right)} [amu/cm^3] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}p{\left(\vec{x} \right)} [nPa] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bx}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{by}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bz}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}

```python
kameleon['bz_ijk'] = gridify(kameleon.bz,
                             x = np.linspace(-25, -10, 30),
                             y = np.linspace(-10, 10, 40), z = 0)
kameleon
```

\begin{equation}\rho{\left(\vec{x} \right)} [amu/cm^3] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}p{\left(\vec{x} \right)} [nPa] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bx}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{by}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bz}{\left(\vec{x} \right)} [nT] = \lambda{\left(\vec{x} \right)}\end{equation}\begin{equation}\operatorname{bz_{ijk}}{\left(x,y,z \right)} = \lambda{\left(x,y,z \right)}\end{equation}

```python
fig = kameleon.plot('bz_ijk')
fig.layout.scene.aspectmode = 'data'
```

```python
import plotly.io as pio

pio.write_image(fig, 'images/kameleon_sample_out.svg')
```