Datawhale组队学习 numpy下 Task02 随机抽样 打卡

numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。

  • numpy.random.seed(seed=None) Seed the generator.

seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的 seed() 值,则每次生成的随
机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间
差异而不同。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指
定唯一的随机种子,避免由于随机的差异对结果产生影响。

离散型随机变量

分布类型方法描述
二项分布numpy.random.binomial(n, p, size=None)从二项分布中抽取样本
泊松分布numpy.random.poisson(lam=1.0, size=None)从泊松分布中抽取样本
超几何分布numpy.random.hypergeometric(ngood, nbad, nsample, size=None)从超几何分布中抽取样本

二项分布

二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如处理猜10次拳赢6次的概率等类似的问题。

二项分布概率函数的数学表示:

  • numpy.random.binomial(n, p, size=None) Draw samples from a binomial distribution.

表示对一个二项分布进行采样, size 表示采样的次数, n 表示做了 n 重伯努利试验, p 表示成功的
概率,函数的返回值表示 n 中成功的次数。

例题

模拟投硬币,投2次,请问两次都为正面的概率?

import numpy as np

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) 
'''
0.25018
0.50046
0.24936
'''

泊松分布

泊松分布主要用于估计某个时间段某事件发生的概率。

  • numpy.random.poisson(lam=1.0, size=None)

表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。

例题

假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?

import numpy as np

np.random.seed(20201125)
lam=42/6
size=50000
x=np.random.poisson(lam,size)
print(np.sum(x==6)/size)
#0.1924

超几何分布

在超几何分布中,各次实验不是独立的,各次实验成功的概率也不等。

  • numpy.random.hypergeometric(ngood, nbad, nsample, size=None)

表示对一个超几何分布进行采样, size 表示采样的次数, ngood 表示总体中具有成功标志的元素个
数, nbad 表示总体中不具有成功标志的元素个数, ngood+nbad 表示总体样本容量, nsample 表示抽
取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取 nsample 个元素中具有成功标识
的元素个数。

例题

一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。

import numpy as np

np.random.seed(20201125)
ngood=7
nbad=13
nsample=12
size=50000
x=np.random.hypergeometric(ngood,nbad,nsample,size)
print(np.sum(x==3)/size)
#0.19598

连续型随机变量

分布类型方法描述
均匀分布numpy.random.uniform(low=0.0, high=1.0, size=None)从均匀分布中抽取样本
正态分布numpy.random.randn(d0, d1, …, dn)从正态分布中抽取样本
指数分布numpy.random.exponential(scale=1.0, size=None)从指数分布中抽取样本

均匀分布

numpy.random.uniform()

从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.

  • numpy.random.uniform(low,high,size)

low: 采样下界,float类型,默认值为0;
high: 采样上界,float类型,默认值为1;
size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。

numpy.random.rand()

作为 uniform() 的特列,可以得到 [0,1) 之间的均匀分布的随机数。

-numpy.random.rand(d0, d1, …, dn)

rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1,dn表格每个维度,返回值为指定维度的array

numpy.random.randint()

作为 uniform 的另一特例,可以得到 [low,high) 之间均匀分布的随机整数.
函数的作用是,返回一个随机整型数,范围从低(包括)到高(不包括),即[low, high)。如果没有写参数high的值,则返回[0,low)的值。

-numpy.random.randint(low, high=None, size=None, dtype=‘l’)

low: int生成的数值最低要大于等于low。(hign = None时,生成的数值要在[0, low)区间内)
high: int (可选)如果使用这个值,则生成的数值在[low, high)区间。
size: int or tuple of ints(可选)输出随机数的尺寸,比如size = (m * n* k)则输出同规模即m * n* k个随机数。默认是None的,仅仅返回满要求的单一随机数。
dtype: dtype(可选):想要输出的格式。如int64、int等等

例题

根据指定大小产生[0,1)之间均匀分布的随机数。

import numpy as np

np.random.seed(20200614)
print(np.random.rand())
print(np.random.rand(5))
print(np.random.rand(4, 3))
np.random.seed(20200614)
print(np.random.uniform()) 
print(np.random.uniform(size=5))
print(np.random.uniform(size=(4, 3)))
'''
0.7594819171852776
[0.75165827 0.16552651 0.0538581  0.46671446 0.89076925]
[[0.10073292 0.14624784 0.40273923]
 [0.21844459 0.22226682 0.37246217]
 [0.50334257 0.01714939 0.47780388]
 [0.08755349 0.86500477 0.70566398]]
0.7594819171852776
[0.75165827 0.16552651 0.0538581  0.46671446 0.89076925]
[[0.10073292 0.14624784 0.40273923]
 [0.21844459 0.22226682 0.37246217]
 [0.50334257 0.01714939 0.47780388]
 [0.08755349 0.86500477 0.70566398]]
'''

正态分布

randn函数返回一个或一组样本,具有标准正态分布。dn表格每个维度,返回值为指定维度的array

  • numpy.random.randn(d0, d1, …, dn)
例题

根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20200614)
size = 50000
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
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()
y1 = stats.norm.cdf(1) ‐ stats.norm.cdf(1)
y2 = stats.norm.cdf(2) ‐ stats.norm.cdf(2)
y3 = stats.norm.cdf(3) ‐ stats.norm.cdf(3)
print(y1) # 0.6826894921370859
print(y2) # 0.9544997361036416
print(y3) # 0.9973002039367398

指数分布

借助于numpy.random.exponential()方法,我们可以从 index 分布中获取随机样本,并使用此方法返回随机样本的numpy数组。

  • numpy.random.exponential(scale=1.0, size=None)

其它随机函数

随机从序列中获取元素

  • numpy.random.choice(a, size=None, replace=True, p=None)

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

对数据集进行洗牌操作

数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。

  • numpy.random.shuffle(x)

对 x 进行重排序,如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。

  • numpy.random.permutation(x)

permutation() 函数的作用与 shuffle() 函数相同,可以打乱第0轴的数据,但是它不会改变原来的数
组。

练习题

1.创建一个形为5×3的二维数组,以包含5到10之间的随机数。
import numpy as np

np.random.seed(20201125)
x = np.random.uniform(2,10,[3,5])
print(x)
y = np.random.rand(3,5)
print(y)
z = np.random.randint(1,11,[3,5])
print(z)
'''
[[8.47852744 2.28637793 3.65397258 9.54061576 6.99311109]
 [2.09847595 4.50327643 2.40579368 5.83678697 7.86667296]
 [3.85294833 9.4795943  7.43877829 4.83976742 6.50165831]]
[[0.3101304  0.21993047 0.11158845 0.93007013 0.02256791]
 [0.50797218 0.21050451 0.34957213 0.84356206 0.38518743]
 [0.82252085 0.53455383 0.28209229 0.17430001 0.02926699]]
[[3 5 9 3 9]
 [7 8 9 5 8]
 [6 9 3 5 4]]
'''
2.创建分别具有5000个数据的训练集(xi,y)和测试集(xi,y),其中xi在间隔(-10,10)上均匀随机分布。为了使回归问题“真实”,大的均匀噪声分布在[-0.2,0.2]已添加到所有训练样本中,同时测试数据保持无噪声

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(20201125)
x = np.random.uniform(-10,10,5000)
y = np.sin(x)/x
print(y)
plt.scatter(x,y)
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值