Python中的随机采样和概率分布(一)
Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成。我们这个系列介绍几个在机器学习中常用的概率函数。先来看最基础的功能——随机采样。
1. random.choice
如果我们只需要从序列里采一个样本(所有样本等概率被采),只需要使用random.choice即可:
import random
res1 = random.choice([0, 1, 2, 3, 4])
print(res1) # 3
2. random.choices(有放回)
当然,很多时候我们不只需要采一个数,而且我们需要设定序列中每一项被采的概率不同。此时我们可以采用random.random.choices函数, 该函数用于有放回的(即一个数据项可以被重复采多次)对一个序列进行采样。其函数原型如下:
random.choices(population, weights=None, *, cum_weights=None, k=1)
population: 欲采样的序列
weights: 每个样本被赋予的权重(又称相对权重),决定每个样本被采的概率,如[10, 0, 30, 60, 0]
cum_weights: 累积权重,相对权重[10, 0, 30, 60, 0]相当于累积权重[10, 10, 40, 100, 100]
我们从[0, 1, 2, 3, 4]中按照相对权重采样3个样本如下:
res2 = random.choices([0, 1, 2, 3, 4], weights=[10, 0, 30, 60, 0], k=3)
# 注意population不是关键字参数,在函数调用时不能写成population=[0,1,2,3,4]来传参
# 关于关键字参数和位置参数,可以参看我的博客《Python技法2:函数参数的进阶用法》https://www.cnblogs.com/orion-orion/p/15647408.html
print(res2) # [3, 3, 2]
从[0, 1, 2, 3, 4]中按照累积权重采样3和样本如下:
res3 = random.choices([0, 1, 2, 3, 4], cum_weights=[10, 10, 40, 100, 100], k=3)
print(res3) # [0, 3, 3]
注意,相对权重weights和累计权重cum_weights不能同时传入,否则会报TypeError异常'Cannot specify both weights and cumulative weights'。
3. numpy.sample(无放回)
random.sample是无放回,如果我们需要无放回采样(即每一项只能采一次),那我们需要使用random.sample。需要注意的是,如果使用该函数,将无法定义样本权重。该函数原型如下:
random.sample(population, k, *, counts=None)¶
population: 欲采样的序列
k: 采样元素个数
counts: 用于population是可重复集合的情况,定义集合元素的重复次数。sample(['red', 'blue'], counts=[4, 2], k=5)等价于sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
我们无放回地对序列[0, 1, 2, 3, 4]采样3次如下:
res3 = random.sample([0, 1, 2, 3, 4], k=3)
print(res3) # [3, 2, 1]
无放回地对可重复集合[0, 1, 1, 2, 2, 3, 3, 4]采样3次如下:
res4 = random.sample([0, 1, 2, 3, 4], k=3, counts=[1, 2, 2, 2, 1])
print(res4) # [3, 2, 2]
如果counts长度和population序列长度不一致,会抛出异常ValueError:"The number of counts does not match the population"。
4.rng.choices 和 rng.sample
还有一种有放回采样实现方法是我在论文[1]的代码[2]中学习到的。即先定义一个随机数生成器,再调用随机数生成器的choices方法或sample方法,其使用方法和random.choice/random.sample函数相同。
rng_seed = 1234
rng = random.Random(rng_seed)
res5 = rng.choices(
population=[0,1,2,3,4],
weights=[0.1, 0, 0.3, 0.6, 0],
k=3,
)
print(res5) # [3, 3, 0]
res6 = rng.sample(
population=[0, 1, 2, 3, 4],
k=3,
)
print(res6) # [4, 0, 2]
这两个函数在论文[1]的实现代码[2]中用来随机选择任务节点client:
def sample_clients(self):
"""
sample a list of clients without repetition
"""
rng_seed = (seed if (seed is not None and seed >= 0) else int(time.time()))
self.rng = random.Random(rng_seed)
if self.sample_with_replacement:
self.sampled_clients = \
self.rng.choices(
population=self.clients,
weights=self.clients_weights,
k=self.n_clients_per_round,
)
else:
self.sampled_clients = self.rng.sample(self.clients, k=self.n_clients_per_round)
5. numpy.random.choices
从序列中按照权重分布采样也可以采用numpy.random.choice实现。其函数原型如下:
random.choice(a, size=None, replace=True, p=None)
a: 1-D array-like or int 如果是1-D array-like,那么样本会从其元素中抽取。如果是int,那么样本会从np.arange(a)中抽取;
size: int or tuple of ints, optional 为输出形状大小,如果给定形状为\((m, n, k)\),那么\(m\times n\times k\)的样本会从中抽取。默认为None,即返回一个单一标量。
replace: boolean, optional 表示采样是又放回的还是无放回的。若replace=True,则为又放回采样(一个值可以被采多次),否则是无放回的(一个值只能被采一次)。
p: 1-D array-like, optional 表示a中每一项被采的概率。如果没有给定,则我们假定a中各项被采的概率服从均匀分布(即每一项被采的概率相同)。
从[0,1,2,3,4,5]中重复/不重复采样3次如下:
import numpy as np
res1 = np.random.choice(5, 3, replace=True)
print(res1) # [1 1 4]
res2 = np.random.choice(5, 3, replace=False)
print(res2) # [2 1 4]
同样是[0,1,2,3,4,5]中重复/不重复采样3次,现在来看我们为每个样本设定不同概率的情况:
res3 = np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
print(res3) # [2 3 3]
res4 = np.random.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
print(res4) # [3 2 0]
参考文献
- [1] Marfoq O, Neglia G, Bellet A, et al. Federated multi-task learning under a mixture of distributions[J]. Advances in Neural Information Processing Systems, 2021, 34.
- [2] https://github.com/omarfoq/FedEM
- [3] https://www.python.org/
- [4] https://numpy.org/
Python中的随机采样和概率分布(一)的更多相关文章
- Python中的随机采样和概率分布(二)
在上一篇博文<Python中的随机采样和概率分布(一)>(链接:https://www.cnblogs.com/orion-orion/p/15647408.html)中,我们介绍了Pyt ...
- python中的随机模块random
random模块是 python 中为随机数所使用的模块 ```import random # 随机生成0-1范围内的随机浮点数i = random.random()print(i) # 随机生成范围 ...
- 在python中实现随机选择
想从一个序列中随机抽取若干元素,或者想生成几个随机数. random 模块有大量的函数用来产生随机数和随机选择元素.比如,要想从一个序列中随机的抽取一个元素,可以使用random.choice() : ...
- python中生成随机整数(random模块)
1.从一个序列中随机选取一个元素返回: random.choice(sep) 2.用于将一个列表中的元素打乱 random.shuffle(sep) 3.在sep列表中随机选取k个 ...
- 关于python中的随机种子——random_state
random_state是一个随机种子,是在任意带有随机性的类或函数里作为参数来控制随机模式.当random_state取某一个值时,也就确定了一种规则. random_state可以用于很多函数,我 ...
- Python中随机森林的实现与解释
使用像Scikit-Learn这样的库,现在很容易在Python中实现数百种机器学习算法.这很容易,我们通常不需要任何关于模型如何工作的潜在知识来使用它.虽然不需要了解所有细节,但了解机器学习模型是如 ...
- 如何在Python中实现这五类强大的概率分布
R编程语言已经成为统计分析中的事实标准.但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易.我要使用Python实现一些离散和连续的概率分布.虽然我不会讨论这些分布的数学细节,但我会 ...
- 如何在Python中从零开始实现随机森林
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 决策树可能会受到高度变异的影响,使得结果对所使用的特定测试数据而言变得脆弱. 根据您的测试数据样本构建多个模型(称为套袋)可以减少这种差异,但是 ...
- H2O中的随机森林算法介绍及其项目实战(python实现)
H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...
随机推荐
- 双堆DEAP
记录一道遇到的考研真题 特性分析: DEAP为一颗完全二叉树,左子树小堆,右子树大堆,故左右子树分别可以用l[].r[]数组存储,用m和n分别表示当前两完全二叉树的结点,左右子树高度差为1,且左子树的 ...
- cat userlist(课上练习)
问题描述 Linux文件系统的三层抽象是什么? 写出Cat userlist的过程,要详述目录文件,i-node.数据块,要画图示意. 假设块大小为4k, userlist的大小不小于10k,自己假设 ...
- linux中解压.tgz, .tar.gz ,zip ,gz, .tar文件
转载:https://blog.csdn.net/fu6543210/article/details/7984578 将.tgz文件解压在当前目录: tar zxvf MY_NAME.tgz 将.ta ...
- configure: error: invalid variable name: `'
今天在交叉编译一个编解码库的时候,出现一个莫名其妙的报错,一直找不到原因,后来无意中删除了一个空格,才发现就是这个空格造成的错误. ./configure --host=arm-linux LDFLA ...
- PWN学习之栈溢出
目录 PWN学习之栈溢出 前言 写bug bug.cpp源码 OD动态调试bug.exe OD调试观察溢出 栈溢出攻击之突破密码验证 x64位栈溢出 PWN学习之栈溢出 前言 我记得我在最开始学编程的 ...
- Python3使用Print输出彩色字体
一.介绍 在一些开发程序中,有些输出消息需要突出显示,我们可以尝试着给他们换上更靓丽的颜色来突出显示. 二.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. ...
- cloudstack部署
参考文档 https://blog.csdn.net/u012124304/article/details/80960504#Mysql_37 cloudstack的rpm包下载地址 http://d ...
- ONVIF协议客户端
前几天跟大家聊了一些关于ONVIF的一些基础知识,它的工作原理以及优势.今天安徽思蔷信息科技为带大家了解一下simpleonvif 百度云盘下载地址:链接:https://pan.baidu.com/ ...
- go的常用数据类型-持续优化篇
p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } p.p2 { margin: ...
- ant生成jmeter测试报告没有数据【已解决】
1.如下图,在配置build时,到网上找配置文件,配置样式表文件名经常是jmeter-results-detail-report_21.xsl, 3.但是在其他版本可能被不是这个文件名,在jmeter ...