numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。
numpy.random.seed(seed=None)
seed()
用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()
值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
离散型随机变量
二项分布
二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如处理猜10次拳赢6次的概率等类似的问题。
二项分布概率函数的代码表示:binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)
numpy.random.binomial(n, p, size=None)
表示对一个二项分布进行采样,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(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次,请问两次都为正面的概率?
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201125)
n = 2
p = 0.5
size = 5000
bins = [0,1,2,3]
x = np.random.binomial(n,p,size)
print(x)
print(np.sum(x==0)/size )
print(np.sum(x==1)/size)
print(np.sum(x==2)/size)
plt.hist(x,bins = bins,align="right",rwidth = 0.8 )
plt.xlabel("随机变量:硬币为正的次数")
plt.ylabel("5000次样本出现的次数")
plt.show()
s = stats.binom.pmf(range(n+1),n,p)
print(np.around(s,3))
泊松分布
泊松分布主要用于估计某个时间段某事件发生的概率。
泊松概率函数的代码表示: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
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201125)
lam = 42/6
size = 50000
x = np.random.poisson(lam,size)
print(np.sum(x==6)/size)
plt.hist(x,rwidth=0.8)
plt.xlabel("十分钟接到订票电话的次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()
x = stats.poisson.pmf(6,lam)
print(x)
超几何分布
在超几何分布中,各次实验不是独立的,各次实验成功的概率也不等。
超几何分布概率函数的数学表示:
numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
表示对一个超几何分布进行采样,size
表示采样的次数,ngood
表示总体中具有成功标志的元素个数,nbad
表示总体中不具有成功标志的元素个数,ngood+nbad
表示总体样本容量,nsample
表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取nsample
个元素中具有成功标识的元素个数。
【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201125)
size = 500000
x = np.random.hypergeometric(ngood=7,nbad=13,nsample=12,size =size)
# x = stats.hypergeom.rvs(M=20,n=7,N=12,size =size)
print(np.sum(x==3)/size)
plt.hist(x,bins=8)
plt.xlabel("狗的数量")
plt.ylabel("500000个样本中出现的次数")
plt.title("超几何分布",fontsize =20)
plt.show()
连续型随机变量
均匀分布
numpy.random.uniform(low=0.0, high=1.0, size=None)
【例】在low到high范围内,创建大小为size的均匀分布的随机数。
mport numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201125)
a =0
b = 100
size = 50000
x = np.random.uniform(a,b,size = size)
print(np.all(x>=0))
print(np.all(x<=100))
y=(np.sum(x<50)-np.sum(x<10))/size
print(y)
plt.hist(x,bins=20,rwidth=0.8)
plt.show()
a= stats.uniform.cdf(10,0,100)
b = stats.uniform.cdf(50,0,100)
print(b-a)
作为uniform()
的特列,可以得到[0,1)
之间的均匀分布的随机数。
numpy.random.rand(d0, d1, ..., dn)
【例】根据指定大小产生[0,1)之间均匀分布的随机数。
mport numpy as np
np.random.seed(20201125)
print(np.random.rand())
print(np.random.rand(5))
print(np.random.rand(4,3))
np.random.seed(20201125)
print(np.random.uniform())
print(np.random.uniform(size= 5))
print(np.random.uniform(size = (4,3)))
作为uniform
的另一特例,可以得到[low,high)
之间均匀分布的随机整数。
numpy.random.randint(low, high=None, size=None, dtype='l')
【例】若high
不为None
时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
import numpy as np
np.random.seed(20201125)
x= np.random.randint(2,size=10)
print(x)
x = np.random.randint(1,size=10)
print(x)
x= np.random.randint(5,size = (2,4))
print(x)
x = np.random.randint(1,10,[3,4])
print(x)
正态分布
标准正态分布数学表示:
numpy.random.randn(d0, d1, ..., dn)
【例】根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(202021125)
size = 5000
x = np.random.randn(size)
y1 = (np.sum(x<1)-np.sum(x<-1))/size
y2 = (np.sum(x<2)-np.sum(x<-2))/size
print(y1)
print(y2)
plt.hist(x,bins=20)
plt.show()
y1= stats.norm.cdf(1)-stats.norm.cdf(-1)
y2 = stats.norm.cdf(2)-stats.norm.cdf(-2)
print(y1)
print(y2)
还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
normal()
为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(20201125)
x = 0.5*np.random.randn(2,4)+5
print(x)
np.random.seed(20201125)
mu = 5
sigma = 0.5
x = np.random.normal(mu,sigma,(2,4))
print(x)
size = 50000
x = np.random.normal(mu,sigma,size)
plt.hist(x)
plt.show()
指数分布
指数分布描述时间发生的时间长度间隔。
指数分布的数学表示:
numpy.random.exponential(scale=1.0, size=None)
【例】scale = 1/lambda
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201125)
lam = 7
size = 50000
x = np.random.exponential(1/lam,size)
y1 = (np.sum(x<1/7))/size
print(y1)
plt.hist(x,bins = 20)
plt.show()
y1 = stats.expon.cdf(1/7,scale = 1/lam)
print(y1)
其它随机函数
随机从序列中获取元素
numpy.random.choice(a, size=None, replace=True, p=None)
从序列中获取元素,若a
为整数,元素取值从np.range(a)
中随机获取;若a
为数组,取值从a
数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复replace
,以及选取元素的概率p
。
【例】
#随机从序列中取数
import numpy as np
np.random.seed(20201125)
x = np.random.choice(10,3)
print(x)
x = np.random.choice(10,3,p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
print(x)
x = np.random.choice(10,3,replace = False,p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
print(x)
aa_milne_arr = ["pooh","rabbit","piglet","Christopher"]
x = np.random.choice(aa_milne_arr,5,p=[0.5,0.1,0.3,0.1])
print(x)
np.random.seed(20201125)
x = np.random.randint(0,10,3)
print(x)
对数据集进行洗牌操作
数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。
numpy.random.shuffle(x)
对x
进行重排序,如果x
为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。
【例】洗牌,改变自身内容,打乱顺序。
np.random.seed(20201125)
x = np.arange(10)
np.random.shuffle(x)
print(x)
print(np.random.shuffle([1,4,9,12,15]))
x = np.arange(20).reshape((5,4))
print(x)
np.random.shuffle(x)
print(x)
numpy.random.permutation(x)
permutation()
函数的作用与shuffle()
函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。
import numpy as np
np.random.seed(20201125)
x = np.arange(10)
y = np.random.permutation(x)
print(y)
print(np.random.permutation([1,4,9,12,15]))
x = np.arange(20).reshape(5,4)
print(x)
y = np.random.permutation(x)
print(y)