numpy基础用法-学习笔记-task07

随机抽样

numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。https://www.cnblogs.com/hhh5460/p/5586098.html#top

  1. numpy.random.seed(seed=None)
    seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的 seed() 值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
    在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。
    PMF (概率质量函数)对离散随机变量的定义,是离散随机变量在各个特定取值的概率。该函数通俗来说,就是对一个离散型概率事件来说,使用该函数来求它各个成功事件结果的概率。
    PDF (概率密度函数) 是对连续型随机变量的定义,与PMF不同的是,在特定点上的值并不是该点的概率,连续随机概率事件只能求连续一段区域内发生事件的概率,通过对这段区间进行积分,可获得事件发生时间落在给定间隔内的概率。
  2. 二项分布(离散型随机变量)
    01
    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
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
np.random.seed(20200605)
n = 9# 做某件事情的次数
p = 0.1# 做某件事情成功的概率
size = 100000
x = np.random.binomial(n, p, size)
print(x)

# 或者使用binom.rvs
# 使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#伪造符合二项分布的随机变量
print(y)

print(np.sum(x == 0) / size) # 0.3897
plt.hist(x)
plt.xlabel('随机变量:成功次数')
plt.ylabel('样本中出现的次数')
plt.show()
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(10), n, p)
print(np.around(s, 3))
# [0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]

02

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

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20200605)
n = 2# 做某件事情的次数,这里是投两次硬币
p = 0.5#做某件事情成功的概率,在这里即投硬币为正面的概率
size = 50000
x = np.random.binomial(n, p, size)
# 或者使用binom.rvs
# #使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
print(np.sum(x == 0) / size) # 0.25154
print(np.sum(x == 1) / size) # 0.49874
print(np.sum(x == 2) / size) # 0.24972
plt.hist(x, density=True)
plt.xlabel('随机变量:硬币为正面次数')
plt.ylabel('50000个样本中出现的次数')
plt.show()
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(n + 1), n, p)
print(np.around(s, 3))
# [0.25 0.5 0.25]

03

  1. 泊松分布
    04
    numpy.random.poisson(lam=1.0, size=None)
    表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数
    【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?
    05
  2. 超几何分布
    06
    numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
    表示对一个超几何分布进行采样, size 表示采样的次数, ngood 表示总体中具有成功标志的元素个数, nbad 表示总体中不具有成功标志的元素个数, ngood+nbad 表示总体样本容量, nsample 表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取nsample 个元素中具有成功标识的元素个数
    【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
    07
# 超几何分布的均值与方差
# 均值E(x) = N(n/M)
# 方差Var(x) = N(n/M)(1‐n/M)((M‐N)/(M‐1))
# 注释:考虑n次实验的超几何分布,令p=n/M,当总体容量足够大时((M‐N)/(M‐1))近似于1,此时数学期望为Np,方差为Np(1‐p).
# #用stats(M, n, N, loc=0, moments='mv')计算均值和方差
# stats.hypergeom.stats(20,7,12,moments='mv')
  1. 均匀分布
    在概率论和统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。 均匀分布由两个参数a和b定义,它们是数轴上的最小值和最大值,通常缩写为U(a,b)。
    numpy.random.uniform(low=0.0, high=1.0, size=None)
    【例】在low到high范围内,创建大小为size的均匀分布的随机数。
    08
    作为 uniform() 的特列,可以得到 [0,1) 之间的均匀分布的随机数。
    numpy.random.rand(d0, d1, …, dn)
    【例】根据指定大小产生[0,1)之间均匀分布的随机数。
    09
    作为 uniform 的另一特例,可以得到 [low,high) 之间均匀分布的随机整数。
    numpy.random.randint(low, high=None, size=None, dtype=‘l’)
    【例】若 high 不为 None 时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
    10
  2. 正态分布
    11
    numpy.random.randn(d0, d1, …, dn)
    【例】根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)。
    12
    还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma。
    numpy.random.normal(loc=0.0, scale=1.0, size=None)Draw random samples from a normal (Gaussian) distribution.
    normal() 为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(20200614)
x = 0.5 * np.random.randn(2, 4) + 5

# 或者
# #模拟10000个随机变量
# x = 0.5*stats.norm.rvs(size=(2,4))+5

print(x)
# [[5.39654234 5.4088702 5.49104652 4.95817289]
# [4.31977933 4.76502391 4.70720327 4.36239023]]
np.random.seed(20200614)
mu = 5#平均值
sigma = 0.5#标准差
x = np.random.normal(mu, sigma, (2, 4))
print(x)
# [[5.39654234 5.4088702 5.49104652 4.95817289]
# [4.31977933 4.76502391 4.70720327 4.36239023]]
size = 50000
x = np.random.normal(mu, sigma, size)
print(np.mean(x)) # 4.996403463175092
print(np.std(x, ddof=1)) # 0.4986846716715106(#样本标准差)
plt.hist(x, bins=20)
plt.show()

13
6. 指数分布
14
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(20200614)
lam = 7
size = 50000
x = np.random.exponential(1 / lam, size)

# 或者
# #rvs(loc=0, scale=1/lam, size=size, random_state=None)模拟

y1 = (np.sum(x < 1 / 7)) / size
y2 = (np.sum(x < 2 / 7)) / size
y3 = (np.sum(x < 3 / 7)) / size
print(y1) # 0.63218
print(y2) # 0.86518
print(y3) # 0.95056
plt.hist(x, bins=20)
plt.show()
y1 = stats.expon.cdf(1 / 7, scale=1 / lam)
y2 = stats.expon.cdf(2 / 7, scale=1 / lam)
y3 = stats.expon.cdf(3 / 7, scale=1 / lam)
print(y1) # 0.6321205588285577
print(y2) # 0.8646647167633873
print(y3) # 0.950212931632136

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

import numpy as np
np.random.seed(20200614)
x = np.random.choice(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])
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])
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']
np.random.seed(20200614)
x = np.random.randint(0, 10, 3)
print(x) # [2 0 1]
  1. 对数据集进行洗牌操作
    数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。
    numpy.random.shuffle(x)
    对 x 进行重排序,如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。
    【例】洗牌,改变自身内容,打乱顺序。
    16
    numpy.random.permutation(x)
    permutation() 函数的作用与 shuffle() 函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。
import numpy as np
np.random.seed(20200614)
x = np.arange(10)
y = np.random.permutation(x)
print(y)
# [6 8 7 5 3 9 1 4 0 2]
print(np.random.permutation([1, 4, 9, 12, 15]))
# [ 4 1 9 15 12]
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]]
y = np.random.permutation(x)
print(y)
# [[ 8 9 10 11]
# [ 0 1 2 3]
# [12 13 14 15]
# [16 17 18 19]
# [ 4 5 6 7]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值