随机抽样

本文介绍了numpy.random模块对Python内置random的补充,涵盖离散型随机变量(二项分布、泊松分布、超几何分布)和连续型随机变量(均匀分布、正态分布、指数分布)的概率函数及示例,还提及随机从序列中获取元素和对数据集洗牌等随机函数,这些在机器学习中有应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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!

泊松概率函数的数学表示:

image

  • 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)

超几何分布

在超几何分布中,各次实验不是独立的,各次实验成功的概率也不等。
超几何分布概率函数的数学表示:image

  • 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)

正态分布

标准正态分布数学表示:
image

  • 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()

指数分布

指数分布描述时间发生的时间长度间隔。

指数分布的数学表示:image

  • 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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值