随机抽样
本文程序可直接运行,但图片导入有点问题;
numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分
布的样本值的函数,如正态分布、泊松分布等。
- numpy.random.seed(seed=None) Seed the generator.
seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed() 值,则每次生成的随
机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间
差异而不同。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指
定唯一的随机种子,避免由于随机的差异对结果产生影响。
离散型随机变量
二项分布
二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如
处理猜10次拳赢6次的概率等类似的问题。
二项分布概率函数的代码表示:binom.pmf(k) = choose(n, k) pk (1-p)(n-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(20201125)
n = 9
p = 0.1
size = 50000
x = np.random.binomial(n, p, size)
print(x)
print(np.sum(x==0)/size)
plt.hist(x)
plt.xlabel("随机变量:成功次数")
plt.ylabel("样本中出现的次数")
plt.show()
s = stats.binom.pmf(range(10),n,p)
print(np.around(s,3))
[2 0 0 ... 0 0 2]
0.3904
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gk6Mkzx3-1606315239569)(output_1_1.png)]
[0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]
【例】模拟投硬币,投2次,请问两次都为正面的概率?
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201125)
n = 2
p = 0.5
size = 50000
x = np.random.binomial(n,p,size)
print(np.sum(x==0)/size)
print(np.sum(x==1)/size)
print(np.sum(x==2)/size)
plt.hist(x, density=True)
plt.xlabel("随机变量:变量为正面次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()
s = stats.binom.pmf(range(n+1),n,p)
print(np.around(s,3))
0.25018
0.50046
0.24936
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKHoOxLt-1606315239571)(output_3_1.png)]
[0.25 0.5 0.25]
计算期望和方差
“”"
期望: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!
泊松概率函数的数学表示:
- numpy.random.poisson(lam=1.0, size=None) Draw samples from a Poisson distribution.
表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函
数的返回值表示一个单位内事件发生的次数。
【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概
率是多少?
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20200605)
lam = 42 / 6 # 平均值:平均每十分钟接到42/6次订票电话
size = 50000
x = np.random.poisson(lam, size)
print(np.sum(x == 6) / size) # 0.14988
plt.hist(x)
plt.xlabel('随机变量:每十分钟接到订票电话的次数')
plt.ylabel('50000个样本中出现的次数')
plt.show()
# 用poisson.pmf(k, mu)求对应分布的概率:概率质量函数 (PMF)