Numpy 学习专题(七)—— 随机抽样

一、随机抽样

  • numpy.random.seed(seed=None)
    seed()用于指定随机数生成时所用算法开始的整数值。如果使用相同的seed()值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。

二、离散型随机变量

1.二项分布

二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如处理猜10次拳赢6次的概率等类似的问题。
numpy.random.binomial(n, p, size=None)表示对一个二项分布进行采样,size表示采样的次数,n表示做了n重伯努利试验,p表示成功的概率,函数的返回值表示n中成功的次数。

np.random.seed(20201125)
n = 3  # 做某件事情的次数,这里是投三次硬币
p = 0.5  # 做某件事情成功的概率,在这里即投硬币为正面的概率
size = 5  # 实验次数,共实验五次,每次实验投掷三次硬币
x = np.random.binomial(n, p, size)
print(x)  # [2 0 1 3 2]
# 表示第一次实验中有两次硬币为正面,第二次实验中有0次硬币为正面,以此类推。

2.泊松分布

泊松分布主要用于估计某个时间段某事件发生的概率。
numpy.random.poisson(lam=1.0, size=None)表示对一个泊松分布进行采样,size表示采样的次数,lam表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。

np.random.seed(20200605)
lam = 42 / 6  # 平均值:平均每十分钟接到42/6次订票电话
size = 5  # 实验五次
x = np.random.poisson(lam, size)
print(x)  # [ 6  3  9  7 10]
# 第一次实验,十分钟内接到电话6次
# 第二次实验,十分钟内接到电话3次
# 以此类推
# 平均每十分钟接到电话42/6次

3.超几何分布

在超几何分布中,各次实验不是独立的,各次实验成功的概率也不等。
numpy.random.hypergeometric(ngood, nbad, nsample, size=None)表示对一个超几何分布进行采样,size表示采样的次数,ngood表示总体中具有成功标志的元素个数,nbad表示总体中不具有成功标志的元素个数,ngood+nbad表示总体样本容量,nsample表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取nsample个元素中具有成功标识的元素个数。

# 一共20只动物里有7只是狗,求抽取12只动物,有3只狗的概率(无放回抽样)。
np.random.seed(20200605)
size = 5  # 共实验五次,每次抽取12只动物
x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)
print(x)  # [5 5 3 2 4]
print(np.sum(x==3)/size)
# 第一次实验,抽取的12只动物中有5只是狗
# 第三次实验,抽取的12只动物中有3只是狗
# 求抽取12只动物,有3只狗的概率为:x中3出现的次数 除以 实验总次数size。即np.sum(x==3)/size

三、连续型随机变量

1.均匀分布

numpy.random.uniform(low=0.0, high=1.0, size=None)

np.random.seed(20200614)
a = 0
b = 100
size = 100000  # 共实验100000次
x = np.random.uniform(a, b, size=size)
y = (np.sum(x < 50) - np.sum(x < 10)) / size
print(y)  # 0.40145,10到50出现的次数占总实验次数的百分之四十,说明满足均匀分布
plt.hist(x, bins=20)
plt.show()  # 如下图所示,100000次实验中每个数值出现的次数基本相同,说明符合0-100内的均匀分布。

在这里插入图片描述

2.正态分布

numpy.random.normal(loc=0.0, scale=1.0, size=None)normal()为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。

np.random.seed(20200614)
size = 50000
x = np.random.normal(loc=1, scale=0.5, size=size)  # 均值为1,标准差为0.5
y1 = (np.sum(x < 1) - np.sum(x < -1)) / size
y2 = (np.sum(x < 2) - np.sum(x < -2)) / size
y3 = (np.sum(x < 3) - np.sum(x < -3)) / size
print(y1)  # 0.68596
print(y2)  # 0.95456
print(y3)  # 0.99744
plt.hist(x, bins=20)
plt.show()

在这里插入图片描述

四、其他随机函数

1. 随机从序列中获取元素

  • numpy.random.choice(a, size=None, replace=True, p=None)
    从序列中获取元素,若a为整数,元素取值从np.range(a)中随机获取;若a为数组,取值从a数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复replace,以及选取元素的概率p。
np.random.seed(20200614)

x = np.random.choice(10, 3)  # 从0-10中随机选数,共选3次
print(x)  # [2 0 1]

x = np.random.randint(0, 10, 3)  # 从0-10中随机选数,共选3次
print(x)  # [2 0 1]

x = np.random.choice(10, 3, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])  # p表示选取元素的概率
print(x)  # [3 2 3]

x = np.random.choice(10, 3, replace=False, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])  # replace=False表示选取元素不可重复
print(x)  # [3 0 2]

aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
x = np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
print(x) # ['pooh' 'rabbit' 'pooh' 'pooh' 'pooh']

2. 对数据集进行洗牌操作

  • numpy.random.shuffle(x)
    对x进行重排序,如果x为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。
    数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。
np.random.seed(20200614)

x = np.arange(10)
print(x)
# [0 1 2 3 4 5 6 7 8 9]

np.random.shuffle(x)
print(x)
# [6 8 7 5 3 9 1 4 0 2]

x = np.arange(20).reshape((5, 4))
print(x)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]]

np.random.shuffle(x)  # 仅沿第0轴洗牌
print(x)
# [[ 4  5  6  7]
#  [ 0  1  2  3]
#  [ 8  9 10 11]
#  [16 17 18 19]
#  [12 13 14 15]]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值