python——numpy——random模块及常见分布模拟⼀、随机数
1、numpy.random.rand()
⽣成均匀分布的随机⼩数。
⼀维数据
import numpy as np
import matplotlib.pyplot as plt
sample=np.random.rand(1000) #⽣成1000个(0,1]之间的⼩数。
plt.hist(sample)
输出:
python生成1到100之间随机数⼆维数组
import numpy as np
np.random.rand(4,3)
输出:
array([[0.98518453, 0.44079493, 0.16225772],
[0.77958445, 0.7090924 , 0.9106563 ],
[0.92259129, 0.83041676, 0.61209929],
[0.85128995, 0.82769906, 0.54040777]])
2、numpy.random.uniform()
⽣成[a, b)的均匀分布
sample=np.random.uniform(0, 5, size=2000)  #⽣成2000个0~5均匀分布的⼩数。
plt.hist(sample)
输出:
3、numpy.random.random()
与numpy.random.rand() 基本⼀致,⽣成均匀分布的随机⼩数。4、numpy.random.randint()
返回均匀分布的随机整数。
⼀维数组
import numpy as np
import matplotlib.pyplot as plt
sample=np.random.randint(0,10,size=2000) #⽣成2000个(0,10]之间的整数。plt.hist(sample)
输出:
由上图可知,是均匀分布的。
⼆维数组
np.random.randint(-5,10) # 返回1个[-5,10)的随机整数
np.random.randint(-5,5,size=(2,2)) #size表⽰数组的维度
输出:
8
array([[ 0,  3],
[-4,  1]])
5、numpy.random.randn()
返回⼀个或⼀组样本,具有标准正态分布
标准正态分布是以0为均值、以1为标准差的正态分布,记为N(0,1)。
import numpy as np
import matplotlib.pyplot as plt
sample=np.random.randn(2000) #⽣成2000个符合正态分布的浮点数。
plt.hist(sample)
输出:
同样,也可以⽣成⼆维数组:
np.random.randn(4,3)
输出:
array([[ 1.51323436e+00, -1.22829798e+00,  5.33658337e-01],
[ 1.40142822e-03,  2.25463274e+00, -8.96981887e-02],
[-5.13055770e-01,  2.38286579e+00,  7.84135515e-01],
[ 4.20508288e-01, -8.41135019e-02, -2.07081489e+00]])
⼆、随机分布
⼆项分布和泊松分布属于离散型随机变量的分布,指数分布和正态分布属于连续型随机变量的分布。
1、np.random.binomial()    ⼆项分布(贝努⼒分布)
⼆项分布的概率函数可⽤公式
其中,
最常见的⼆项分布就是投硬币问题了,投n次硬币,正⾯朝上次数就满⾜该分布。下⾯我们使⽤计算机模拟的⽅法,产⽣1000个符合的⼆项分布随机数,相当于进⾏1000次实验,每次实验投掷了n枚硬币,正⾯朝上的硬币数就是所产⽣的随机数。同时使⽤直⽅图函数绘制出⼆项分布的PMF图。
def plot_binomial(n,p):
sample = np.random.binomial(n,p,size=1000)  # 产⽣1000个符合⼆项分布的随机数
bins = np.arange(n+2)
plt.hist(sample, bins=bins, align='left', density=True, rwidth=0.1)  # bins也就是总共有⼏条条状图,density表⽰条形图的总⾯积为1.
#设置标题和坐标
plt.title('概率质量分布:n={}, π={}'.format(n,p))
plt.xlabel('正⾯次数')
plt.ylabel('概率')
plt.show()
plot_binomial(10,0.5)
输出:
投10枚硬币,如果正⾯或反⾯朝上的概率相同,即π=0.5, 那么出现正⾯次数的分布符合上图所⽰的⼆项分布。该分布左右对称,最有可能的情况是正⾯出现5次。
当π=0.2或者0.8时:
fig=plt.figure(figsize=(8,4))
ax=fig.add_subplot(1,2,1)
plot_binomial(10,0.2)
ax=fig.add_subplot(1,2,2)
plot_binomial(10,0.8)
输出:
2、np.random.poisson()    泊松分布
泊松分布分布⼀般记作,其概率函数为:
式中,为Poisson分布的总体均数(表⽰概率); 为观察单位内某稀有事件的发⽣次数; 为⾃然对数的底,为常数,约等于2.71828,⾃然对数的底数e是由⼀个重要极限给出的:当x趋于⽆限时,。
⽐如你在等公交车,假设这些公交车的到来是独⽴且随机的,前后车之间没有关系,那么在1⼩时中到来的公交车数量就符合泊松分布。同样使⽤统计模拟的⽅法绘制该泊松分布,这⾥假设每⼩时平均来6辆车(即上述公式中=6)。
lamb = 6
sample = np.random.poisson(lamb, size=1000)  # ⽣成1000个符合泊松分布的随机数
bins = np.arange(20)
plt.hist(sample, bins=bins, align='left', rwidth=0.1, density=True) # bins也就是总共有⼏条条状图,density表⽰条形图的总⾯积为1.
plt.title('概率质量分布 (λ=6)')
plt.xlabel('⼀⼩时内公交车到达数量')
plt.ylabel('概率')
plt.show()
输出:
3、ponential()    指数分布
设随机变量X的分布密度函数为
指数分布通常⽤作各种“寿命”的分布。例如,⽆线电元件的寿命,动物的寿命等,另外电话问题的通话时间、随机服务系统中的服务时间等都可以认为服从指数分布,因此,它在排队论和可靠性理论等领域中有⼴泛的应⽤。
⽐如上⾯等公交车的例⼦,两辆车到来的时间间隔,就符合指数分布。假设平均间隔为10分钟(即1/=10),那么从上次发车开始,你等车的时间就满⾜下图所⽰的指数分布。
t = 10
sample = ponential(t, size=10000)  # 产⽣10000个满⾜指数分布的随机数
plt.hist(sample, bins=80, alpha=0.7, density=True) # bins也就是总共有⼏条条状图,density表⽰条形图的总⾯积为1.
plt.margins(0.02)
# 根据公式绘制指数分布的概率密度函数
lam = 1 / t
x = np.arange(0,80,0.1)
y = lam * np.exp(- lam * x)
plt.plot(x,y,color='orange', lw=3)#设置标题和坐标轴
plt.title('指数概率密度函数, 1/λ=10')
plt.xlabel('时间')
plt.ylabel('概率')
plt.show()
输出:
4、al()    正态分布
正态分布的概率密度函数(即纵向的曲线⾼度)
规定了曲线的形状,反应了其在横轴上的位置不同。
绘制了(均值)为0,(标准差)为1的正态分布的概率密度曲线。