【Task07】Numpy学习打卡

该博客主要介绍Python中Numpy随机抽样相关方法,并与Scipy库对比学习。涵盖random.seed()方法,离散型随机变量(二项、泊松、超几何分布)和连续型随机变量(均匀、正态、指数分布)在两库中的实现,还提及其他随机函数,最后布置了随机抽样相关作业。

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

Task07思维导图

在这里插入图片描述

注:为了节约行数,默认import numpy as np已经写在每段代码前,不再重复写入,如果有新的包引入,会在代码头部import。

前言

在本章中,我们会学习Numpy中随机抽样的相关方法,而由于Scipy库也是Python中科学计算不可或缺的一个模块,所以我们进行对比学习。
在这里插入图片描述

1、random.seed()方法

在这里插入图片描述

seed( ) 用于指定随机数生成时所用算法开始的整数值

  • 如果使用相同的seed( )值,则每次生成的随即数都相同
  • 如果不设置这个值,则系统根据时间来自己选择这个值,生成自己的种子,此时每次生成的随机数因时间差异而不同
  • 设置的seed()值仅一次有效

一般来说,设置成当天的日期为好,如:

>>> np.random.seed(20201125)

2、random.seed()方法实例

#案例1
>>> for i in range(5):
>>>     print(np.random.random())
0.38797992474085063
0.27952815592665314
0.5933277494875425
0.5398467698311418
0.0075104331643769395
#案例2
>>> for i in range(5):
>>>     np.random.seed(1)
>>>     print(np.random.random())
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
#案例3
>>> np.random.seed(1)
>>> for i in range(5):
>>>     print(np.random.random())
0.417022004702574
0.7203244934421581
0.00011437481734488664
0.30233257263183977
0.14675589081711304

案例1是为了说明如不使用seed()方法,产生的随机数可能会不同。案例2说明,如果在每次使用random()方法前使用seed()方法,那么产生的随机数会保持相同。案例3说明需在每次使用random()方法前使用seed()方法,否则仍跟案例1情况相同。

一、离散型随机变量

1、二项分布

在概率论和统计学中,二项分布是n个独立的成功/失败试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。这样的单次成功/失败试验又称为伯努利试验。实际上,当n=1时,二项分布就是伯努利分布。

二项分布的概率密度函数为:
在这里插入图片描述

1)在numpy中实现

在这里插入图片描述
参数解释:

  • n:二项分布的次数
  • p:二项分布的成功概率
  • size:我的理解是size表示进行二项分布的次数,比如size=10,那么就进行10次上面参数的二项分布
#设置中文字体
>>> font = {'family' : 'SimHei',
>>>         'weight' : 'bold',
>>>         'size'   : '16'}	# 步骤一(设置字体的更多属性)
>>> plt.rc('font', **font)               
>>> plt.rc('axes', unicode_minus=False)  # 步骤二(解决坐标轴负数的负号显示问题)
>>> n = 10
>>> p = 0.5
>>> size = 10
>>> x = np.random.binomial(n,p,size)
>>> print(x)
[4 7 6 4 5 4 4 3 7 2]
>>> plt.hist(x,range=(0,11))
>>> plt.xlabel('随机变量:硬币为正的数量')
>>> plt.xlabel('整体样本中出现的次数:')
>>> plt.show()

在这里插入图片描述
plt.hist()方法生成的是传入数据的直方图,官方文档解释如下:
Compute and draw the histogram of x

2)在scipy中实现

>>> s = stats.binom.pmf(range(10),n,p)
>>> print(s)
[0.00097656 0.00976563 0.04394531 0.1171875  0.20507813 0.24609375
 0.20507813 0.1171875  0.04394531 0.00976563]

在这里插入图片描述

stats.binom.pmf()方法求得的是概率分布,第一个参数是用于储存概率的数据结构,第二个结构是二项分布中重复的次数,第三个参数是二项分布中成功的概率。

2、泊松分布

泊松分布的概率密度函数为:
在这里插入图片描述

泊松分布的参数λ是单位时间(或单位面积)内随机事件的平均发生次数。 泊松分布适合于描述单位时间内随机事件发生的次数。

1)在numpy中实现

在这里插入图片描述
lam及在单位时间内某事发生的平均次数,而size依然是改试验重复的次数。

这里我们注意,泊松分布概率函数中的k在random.poisson()中并没有体现,方法返回的是长度为50000的,λ为lam的试验数据,其依然可以通过seed()方法固定随机情况

在这里插入图片描述

2)在scipy中实现

>>> x = stats.poisson.pmf(6,lam)
>>> print(x)
0.14900277967433773

这里我们对比可以看到,虽然在scipy中实现比numpy求值要便捷很多,但是在numpy中可以更直观地展示数据。

3、超几何分布

超几何分布的概率密度函数为:
在这里插入图片描述
可以描述为产品抽样检查中经常遇到一类实际问题,假定在N件产品中有M件不合格品,即不合格率。在产品中随机抽n件做检查,发现x件不合格品的概率。

1)在numpy中实现

在这里插入图片描述
参数解释:

  • ngood:目标物品的数量
  • nbad:总体减去目标物品的数量
  • nsample:要抽取的随机物品的数量
  • size:试验总次数

20只动物里有7只是狗,无放回抽取12只狗的数量,重复50000次
在这里插入图片描述

2)在scipy中实现

>>> s = stats.hypergeom.pmf(k=range(8),M=ngood+nbad,n=ngood,N=nsample)
>>> print(np.round(s,3))
[0.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

其中M为总量,n为目标物品的数量,N为本次抽取的数量,需要注意的是,scipy的实现和numpy的实现在参数上有所不同,但是都能通过计算完全显示,比如M=ngood+nbad。

二、连续型随机变量

1、均匀分布

均匀分布的概率密度函数为:

在这里插入图片描述
在概率论和统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。 均匀分布由两个参数a和b定义,它们是数轴上的最小值和最大值,通常缩写为U(a,b)。

1)在numpy中实现

在这里插入图片描述
参数解释:

  • low:最小值,默认值为0
  • high:最大值,默认值为1
  • size:随机重复次数

在这里插入图片描述

在这里插入图片描述

random.rand()方法random.uniform()方法对比后可知,前者是特殊化的后者,范围被限定在0到1之间,而生成的数据都是浮点型:

>>> np.random.seed(20201125)
>>> x = np.random.rand(3,3)
>>> print(x)
[[0.80981593 0.03579724 0.20674657]
 [0.94257697 0.62413889 0.01230949]
 [0.31290955 0.05072421 0.47959837]]
>>> np.random.seed(20201125)
>>> x = np.random.uniform(0,1,size=(3,3))
>>> print(x)
[[0.80981593 0.03579724 0.20674657]
 [0.94257697 0.62413889 0.01230949]
 [0.31290955 0.05072421 0.47959837]]

在这里插入图片描述

random.randint()方法random.uniform()方法对比后可知,前者是特殊化的后者,前者生成的数据是整型,而后者生成的数据都是浮点型:

>>> a = 0
>>> b = 100
>>> np.random.seed(20201125)
>>> x = np.random.randint(a,b,size=(3,3))
>>> print(x)
[[91 91  3]
 [77 88 13]
 [40 52 28]]
>>> np.random.seed(20201125)
>>> x = np.random.uniform(a,b,size=(3,3))
>>> print(x)
[[80.98159305  3.57972415 20.67465728]
 [94.25769694 62.41388859  1.2309494 ]
 [31.2909554   5.07242105 47.95983712]]

我们还可以看到,就算使用seed()方法设置相同的种子,但是生成的整型和浮点型的整数部分也是不相关的。

2)在scipy中实现

>>> a = 0
>>> b = 100
>>> x = stats.uniform.cdf(10,a,b)
>>> y = stats.uniform.cdf(50,a,b)
>>> print(y-x)
0.4
>>> x = stats.uniform.cdf(a,a,b)
>>> y = stats.uniform.cdf(b,a,b)
>>> print(y-x)
1.0

其中stats.uniform.cdf()方法是求均匀分布的累积分布,其函数如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、正态分布

一维正态分布概率密度函数为:
在这里插入图片描述
其均值为μ,标准差为σ

1)在numpy中实现

在这里插入图片描述
参数解释:

  • loc:均值μ
  • scale:标准差σ
  • size:生成形状,为int型时表示长度

生成一个shape为2*4的服从正态分布的数组:

>>> np.random.seed(20201125)
#均值
>>> mu = 6
#标准差
>>> sigma = 0.1
#生成数据形状
>>> size = (2,4)
>>> x = np.random.normal(mu,sigma,size)
>>> print(x)
[[5.96965436 5.98736326 6.1735022  5.98482979]
 [5.88968918 6.13679396 5.8181901  6.06004545]]

生成50万个服从该正态分布的数组:
在这里插入图片描述

2)在scipy中实现

实现方法norm.pdf(x, loc, scale),其中x表示分布总体X <= x的概率和,loc表示均值μ,scale表示标准差σ:

>>> y = stats.norm.cdf(6.1,loc = 6,scale = 0.1) - stats.norm.cdf(5.9,loc = 6,scale = 0.1)
>>> print(y)
0.6826894921370843
>>> print((np.sum(x < 6.1) - np.sum(x < 5.9)) / size)
0.682262

3)标准正态分布

标准正态分布的均值为0,标准差为1,其概率密度函数为:

在这里插入图片描述

由于标准正态分布是一种特殊的正态分布,所以不展开叙述,仅介绍numpy中的标准正态分布实现方法:

在这里插入图片描述

其中参数可代表生成的数据的维度,也可以为int型变量,代表生成的一维数据的长度。

另外,在scipy中实现标准正态分布依然使用norm.pdf(x, loc, scale)方法,只不过不指定loc和scale(默认值分别是0和1)。

3、指数分布

指数分布的概率密度函数为:
在这里插入图片描述
其中λ > 0是分布的一个参数,常被称为率参数(rate parameter)。即每单位时间内发生某事件的次数。

1)在numpy中实现


参数解释:

  • scale:1/λ,保证非负
  • size:生成的数据的维度,也可以为int型变量,代表生成的一维数据的长度

在这里插入图片描述

2)在scipy中实现

>>> y = stats.expon.cdf(1/7,scale=1/lam)
>>> print(y)
0.6321205588285577

stats.expon.cdf()求得的是概率密度。

三、其他随机函数

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

在这里插入图片描述

参数解释:

  • a: 一维array或者整数,当为整数时生成np.arange(a)
  • size:随机获取的次数
  • replace:是否放回
  • p:抽取概率
#从np.range(a)中随机获取元素 概率均等
>>> np.random.seed(20201125)
>>> x = np.random.choice(10,3)
>>> print(x)
[3 8 6]
#从np.range(a)中随机获取元素 概率指定
>>> np.random.seed(20201125)
>>> x = np.random.choice(10,3,p=[0.1,0.1,0,0,0,0,0,0,0,0.8])
>>> print(x)
[9 0 9]
#从np.range(a)中随机获取元素 概率指定且生成元素不重复
>>> np.random.seed(20201125)
>>> x = np.random.choice(10,3,replace = False,p=[0.1,0.1,0,0,0,0,0,0,0,0.8])
>>> print(x)
[9 0 1]
#从指定数据中随机获取元素 概率指定
>>> data = ['a','b','c']
>>> np.random.seed(20201125)
>>> x = np.random.choice(data,6,p=[0.5,0.4,0.1])
>>> print(x)
['b' 'a' 'a' 'c' 'b' 'a']

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

在这里插入图片描述
参数解释:

  • x:需要进行洗牌的数据结构

返回值为None

下面是简单的洗牌操作:

>>> np.random.seed(20201125)
>>> x = np.random.randint(0,100,10)
>>> print(x)
[91 91  3 77 88 13 40 52 28 19]
>>> np.random.seed(20201125)
>>> np.random.shuffle(x)
>>> print(x)
[52  3 88 13 91 91 19 40 28 77]

我们来洗一个二维数组:

在这里插入图片描述
我们可以看到,它将第2、3行调换了位置。

在官方的文档中,random.shuffle()方法只能对第一维度进行洗牌,那么如果对于上面的数组,想要对其第二维度进行洗牌有什么办法呢?

我们可以用numpy的另一个洗牌方法:

在这里插入图片描述
random.Generator.shuffle()方法random.shuffle()方法多了一个可以指定洗牌维度的参数axis,我们调用一下试试:

在这里插入图片描述

这里注意它的使用方法是通过random.default_rng()去调用的。

四、作业

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

【知识点:随机抽样】

如何创建随机二维数组?

#整型
>>> data = np.random.randint(5,10,(5,3))
>>> print(data)
[[9 7 8]
 [5 7 7]
 [8 8 9]
 [6 7 6]
 [9 8 9]]
#浮点型
>>> data = np.random.uniform(5,10,(5,3))
>>> print(data)
[[7.10146244 7.58977707 7.27101869]
 [8.73973457 9.13760369 8.69965053]
 [5.56770646 6.52635202 8.33992477]
 [7.22468696 6.0879089  5.60673334]
 [9.93335832 5.69551319 9.03317529]]

2、生成相应的数据

【知识点:随机抽样】

在这里插入图片描述

创建分别具有5000个数据的训练集(xi,y)和测试集(xi,y),其中xi在间隔(-10,10)上均匀随机分布。为了使回归问题“真实”,大的均匀噪声分布在[-0.2,0.2]已添加到所有训练样本中,同时测试数据保持无噪声。

版本1:
在这里插入图片描述
版本2:

在这里插入图片描述

参考文献

#numpy.random.seed()的理解
1、https://blog.csdn.net/album_gyd/article/details/89469761

#matplotlib设置中文字体
2、https://www.cnblogs.com/hhh5460/p/4323985.html

#numpy官方文档
3、https://numpy.org/doc/stable/search.html

#scipy.stats.norm函数
4、https://blog.csdn.net/m0_37586991/article/details/89792673

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值