本帖最后由 waterman 于 2024-12-22 10:23 编辑
概率分布可以理解为生成所需数值的一个函数。数值的生成过程是随机的,但是任意数值出现的可能都遵循一般形式。
深度学习中主要用到对概率分布进行采样的地方,就是在训练之前对网络参数进行初始化。目前主流的神经网络都使用均匀分布或正态分布对参数中的权重项(或偏置项)进行初始化。
下面学习如何使用numpy对不同的概率分布进行采样。
# 离散型概率分布
## 二项分布
二项分布表示如果重复多次实验,每次都有某事件以相同概率发生,那么在所有实验中该事件有望发生的次数。在numpy中,调用random模块中的binomial来实现。
```python
>>> import numpy as np
>>> t = np.random.binomial(5, 0.3, size = 1000)
>>> s = np.bincount(t)
>>> s
array([155, 369, 313, 124,38, 1], dtype=int64)
>>> s / s.sum()
array([0.155, 0.369, 0.313, 0.124, 0.038, 0.001])
```
上述代码实现了实验次数5次,事件概率0.3的1000个二项分布样本。并得出了所有可能取值的概率。
## 伯努利分布
伯努利分布是一种特殊的二项分布,对应二项分布中实验次数固定为1的情况。
当p=0.5时,实现代码如下:
```python
>>> t = np.random.binomial(1, 0.5, size = 1000)
>>> s = np.bincount(t)
>>> s
array([471, 529], dtype=int64)
>>> s / s.sum()
array([0.471, 0.529])
```
## 泊松分布
如果不知道一个时间在某次实验中发生的概率,但知道在某个区间上,该事件发生的平均次数为lamda,就能够计算在相同的区间上,时间发生k次的概率,这就是泊松分布。
实现代码如下:
```python
>>> import numpy as np
>>> lamda = 5
>>> t = np.random.poisson(5, size = 1000)
>>> s = np.bincount(t)
>>> s
array([6,34,97, 150, 166, 179, 147, 106,67,29,13, 6],
dtype=int64)
>>> t.max()
11
>>> s / s.sum()
array([0.006, 0.034, 0.097, 0.15 , 0.166, 0.179, 0.147, 0.106, 0.067,
0.029, 0.013, 0.006])
```
在二项分布中,事件的发生次数不能大于n,但是在泊松分布中,事件的发生次数可以大于lamda。其中事件发生的最大次数为11,且最常出现的事件发生次数在均值lamda附近。
# 连续型概率分布
连续型概率分布与离散型概率分布一样,也有特定的形态,但是不同于离散分布对任意可取的整数都有一定的概率值,连续分布对于取值范围内每点的概率值都为0。讨论给定区间的取值概率才有意义。
下面分别给出均匀分布、正态分布、伽马分布和贝塔分布的概率密度函数采样代码
```python
import numpy as np
import matplotlib.pylab as plt
N = 10000000
B = 100
x = np.arange(B)/B
#uniform
t = np.random.random(N)
u = np.histogram(t, bins=B)[0]
u = u / u.sum()
#normal
t = np.random.normal(0, 1, size=N)
n = np.histogram(t, bins=B)[0]
n = n / n.sum()
#gamma
t = np.random.gamma(5.0, size=N)
g = np.histogram(t, bins=B)[0]
g = g / g.sum()
#beta
t = np.random.beta(5,2, size=N)
b = np.histogram(t, bins=B)[0]
b = b / b.sum()
```
绘制出来如下图所示:
```python
plt.plot(x,u,color='k',linestyle='solid')
plt.plot(x,n,color='k',linestyle='dotted')
plt.plot(x,g,color='k',linestyle='dashed')
plt.plot(x,b,color='k',linestyle='dashdot')
plt.ylabel("Probability")
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.show()
plt.close()
```