前言
numpy.random.seed(seed=None)
Seed the generator
seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的 seed() 值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。
离散型随机变量
二项分布
- 二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率计算问题。比如处理10次猜拳赢6次的概率等类似的问题。
- 二项分布概率函数的代码表示:
binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)
- 二项分布概率函数的数学表示:
P { X = k } = C n k p k ( 1 − p ) k P\{X=k\}=C_n^kp^k(1-p)^k P{X=k}=Cnkpk(1−p)k
numpy.random.binomial(n, p, size=None)
Draw samples from a binomial distribution
表示对一个二项分布进行采样,size表示采样的次数,n表示做了n重伯努利试验,p表示成功的概率,函数的返回值表示n中成功的次数。
【例】野外正在进行 9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是 0.1(p=0.1)。请问,最终所有的勘探井都勘探失败的概率?
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201126)
n = 9 # 做某件事的次数
p = 0.1 # 做某件事情成功的概率
size = 50000 # 采样次数
x = np.random.binomial(n, p, size)
print(x)
print('随机抽样的概率值为',np.sum(x == 0) / size) # 全部失败的概率
plt.rc('font', family='SimHei', size=15)
plt.hist(x)
plt.xlabel('随机变量:成功次数')
plt.ylabel('样本中出现的次数')
plt.show()
# 它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(0, n, p)
print('理论概率值为',np.around(s, 5))
【例】模拟投硬币,投2次,请问两次都为正面的概率?
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
n = 2
p = 0.5
size = 10000
x = np.random.binomial(n, p, size)
print(x)
print('随机抽样的概率值为', np.sum(x == 2) / size)
plt.rc('font', family="SimHei", size=15)
plt.hist(x)
plt.xlabel('随机变量:正面朝上次数')
plt.ylabel('样本中出现次数')
plt.show()
s = stats.binom.pmf(range(n + 1), n, p)
print('理论概率值为', s)
- 计算期望和方差
期望:E(x) = np
方差:Var(x) = np(1‐p)
利用stats.binom.stats(n, p, loc=0, moments='mv')计算期望和方差
moments参数中:m为期望,v为方差
泊松分布
- 泊松分布主要用于估计某个时间段某事件发生的概率。
- 泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam) lam*k / k!
- 泊松概率函数的数学表示:
P { X = k ) } = λ k k ! e − λ , k = 0 , 1 , ⋯ P\{X = k)\}= \frac{\lambda^k}{k!}e^{-\lambda}, k = 0, 1, \cdots P{X=k)}=k!λke−λ,k=0,1,⋯
numpy.random.poisson(lam=1.0, size=None)
Draw samples from a Poisson distribution
表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。
【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201127)
lam = 42 / 6 # 平均每10分钟接到的电话
size = 50000
x = np.random.poisson(lam, size)
print(x)
print('随机抽样的概率值为',np.sum(x == 6) / size)
plt.rc('font', family='SimHei', size=15)
plt.hist(x)
plt.xlabel('随机变量:每10分钟接到的电话次数')
plt.ylabel('样本中出现的次数')
plt.show()
s = stats.poisson.pmf(6, lam)
print('理论概率值为', np.round(s, 6))
超几何分布
- 在超几何分布中,各次实验不是独立的,各次实验成功的概率也不等。
- 超几何分布概率函数的数学表示:
P { k , M , n , N } = C n k C M − n N − k C M N P\{k,M,n,N\}=\frac{C_n^kC_{M-n}^{N-k}}{C_M^N} P{k,M,n,N}=CMNCnkCM−nN−k
numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
Draw samples from a Hypergeometric distribution
表示对一个超几何分布进行采样, size 表示采样的次数, ngood 表示总体中具有成功标志的元素个数, nbad 表示总体中不具有成功标志的元素个数, ngood+nbad 表示总体样本容量, nsample 表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取 nsample 个元素中具有成功标识的元素个数。
【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
np.random.seed(20201127)
size = 50000
x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)
print(x)
print('随机抽样的概率值为',np.sum(x == 3) / size)
plt.rc('font', family='SimHei', size=15)
plt.hist(x)
plt.xlabel('随机变量:抽取的狗的数目')
plt.ylabel('样本中出现的次数')
plt.show()
s = stats.hypergeom.pmf(k=3, M=20, n=7, N=12)
print('理论概率值为',np.round(s, 3))
超几何分布的均值与方差
均值E(x) = N(n/M)
方差Var(x) = N(n/M)(1‐n/M)((M‐N)/(M‐1))
注释:考虑n次实验的超几何分布,令p=n/M,当总体容量足够大时((M‐N)/(M‐1))近似于1,
此时数学期望为 Np,方差为Np(1‐p).
#用stats(M, n, N, loc=0, moments='mv')计算均值和方差
stats.hypergeom.stats(20,7,12,moments='mv')