文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Numpy随机抽样如何实现

2023-07-05 07:48

关注

这篇文章主要介绍了Numpy随机抽样如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Numpy随机抽样如何实现文章都会有所收获,下面我们一起来看看吧。

前言

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

一、随机模块

numpy.random.seed(seed=None)

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

二、离散型随机变量

二项分布

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

二项分布概率函数的代码表示:binom.pmf(k) = choose(n, k) pk (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 npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200605)n = 9# 做某件事情的次数p = 0.1# 做某件事情成功的概率size = 50000x = 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.3897plt.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.   ]

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

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)n = 2# 做某件事情的次数,这里是投两次硬币p = 0.5#做某件事情成功的概率,在这里即投硬币为正面的概率size = 50000x = 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.25154print(np.sum(x == 1) / size)  # 0.49874print(np.sum(x == 2) / size)  # 0.24972plt.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]

计算期望和方差

期望:E(x) = np
方差:Var(x) = np(1-p)
利用stats.binom.stats(n, p, loc=0, moments='mv')计算期望和方差
moments参数中:m为期望,v为方差

泊松分布

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

泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam) lam*k / k!

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

numpy.random.poisson(lam=1.0, size=None)表示对一个泊松分布进行采样,size表示采样的次数,lam表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。
【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)lam = 42 / 6# 平均值:平均每十分钟接到42/6次订票电话size = 50000x = np.random.poisson(lam, size)'''或者#模拟服从泊松分布的50000个随机变量x = stats.poisson.rvs(lam,size=size)'''print(np.sum(x == 6) / size)  # 0.14988plt.hist(x)plt.xlabel('随机变量:每十分钟接到订票电话的次数')plt.ylabel('50000个样本中出现的次数')plt.show()#用poisson.pmf(k, mu)求对应分布的概率:概率质量函数 (PMF)x = stats.poisson.pmf(6, lam)print(x)  # 0.14900277967433773

超几何分布

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

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

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

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)size = 500000x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)'''或者#用rvs(M, n, N, loc=0, size=1, random_state=None)模拟x = stats.hypergeom.rvs(M=20,n=7,N=12,size=size)'''print(np.sum(x == 3) / size)  # 0.198664plt.hist(x, bins=8)plt.xlabel('狗的数量')plt.ylabel('50000个样本中出现的次数')plt.title('超几何分布',fontsize=20)plt.show()"""M 为总体容量n 为总体中具有成功标志的元素的个数N,k 表示抽取N个元素有k个是成功元素"""x = range(8)#用hypergeom.pmf(k, M, n, N, loc)来计算k次成功的概率s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12)print(np.round(s, 3))# [0.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

超几何分布的均值与方差

均值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')

三、连续型随机变量

均匀分布

【例】在low到high范围内,创建大小为size的均匀分布的随机数。

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)a = 0b = 100size = 50000x = np.random.uniform(a, b, size=size)print(np.all(x >= 0))  # Trueprint(np.all(x < 100))  # Truey = (np.sum(x < 50) - np.sum(x < 10)) / sizeprint(y)  # 0.40144plt.hist(x, bins=20)plt.show()a = stats.uniform.cdf(10, 0, 100)b = stats.uniform.cdf(50, 0, 100)print(b - a)  # 0.4

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

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

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

作为uniform的另一特例,可以得到[low,high)之间均匀分布的随机整数。

【例】若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

import numpy as npnp.random.seed(20200614)x = np.random.randint(2, size=10)print(x)# [0 0 0 1 0 1 0 0 0 0]x = np.random.randint(1, size=10)print(x)# [0 0 0 0 0 0 0 0 0 0]x = np.random.randint(5, size=(2, 4))print(x)# [[3 3 0 1]#  [1 1 0 1]]x = np.random.randint(1, 10, [3, 4])print(x)# [[2 1 7 7]#  [7 2 4 6]#  [8 7 2 8]]

四、正态分布

标准的正太分布数学表示:

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

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)size = 50000x = np.random.randn(size)y1 = (np.sum(x < 1) - np.sum(x < -1)) / sizey2 = (np.sum(x < 2) - np.sum(x < -2)) / sizey3 = (np.sum(x < 3) - np.sum(x < -3)) / sizeprint(y1)  # 0.68596print(y2)  # 0.95456print(y3)  # 0.99744plt.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.6826894921370859print(y2)  # 0.9544997361036416print(y3)  # 0.9973002039367398

还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma。

import numpy as npimport matplotlib.pyplot as pltnp.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 = 50000x = np.random.normal(mu, sigma, size)print(np.mean(x))  # 4.996403463175092print(np.std(x, ddof=1))  # 0.4986846716715106(#样本标准差)'''ddof:int, optionalMeans Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. By default ddof is zero.'''plt.hist(x, bins=20)plt.show()

五、指数分布

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

指数分布的数学表示:

【例】scale = 1/lambda

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)lam = 7size = 50000x = np.random.exponential(1 / lam, size)'''或者#rvs(loc=0, scale=1/lam, size=size, random_state=None)模拟'''y1 = (np.sum(x < 1 / 7)) / sizey2 = (np.sum(x < 2 / 7)) / sizey3 = (np.sum(x < 3 / 7)) / sizeprint(y1)  # 0.63218print(y2)  # 0.86518print(y3)  # 0.95056plt.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.6321205588285577print(y2)  # 0.8646647167633873print(y3)  # 0.950212931632136

其他随机函数

随机从序列中获取元素

import numpy as npnp.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]

对数据集进行洗牌操作

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

import numpy as npnp.random.seed(20200614)x = np.arange(10)np.random.shuffle(x)print(x)# [6 8 7 5 3 9 1 4 0 2]print(np.random.shuffle([1, 4, 9, 12, 15]))# Nonex = 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)print(x)# [[ 4  5  6  7]#  [ 0  1  2  3]#  [ 8  9 10 11]#  [16 17 18 19]#  [12 13 14 15]]
import numpy as npnp.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]]

关于“Numpy随机抽样如何实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Numpy随机抽样如何实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯