浅析Python中的随机采样和概率分布


Posted in Python onDecember 06, 2021

 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×n×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]

参考文献

https://github.com/omarfoq/FedEM

https://www.python.org/

https://numpy.org/

到此这篇关于浅析Python中的随机采样和概率分布的文章就介绍到这了,更多相关Python内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
Python生成器以及应用实例解析
Feb 08 Python
使用Python进行目录的对比方法
Nov 01 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
python实现查找所有程序的安装信息
Feb 18 Python
python和php学习哪个更有发展
Jun 17 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 18 Python
python程序的组织结构详解
Python中异常处理用法
Nov 27 #Python
python中的3种定义类方法
Nov 27 #Python
5道关于python基础 while循环练习题
Nov 27 #Python
Python中的pprint模块
Nov 27 #Python
python 多态 协议 鸭子类型详解
Nov 27 #Python
Python机器学习实战之k-近邻算法的实现
You might like
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
js数据类型检测总结
2018/08/05 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Sanic框架路由用法实例分析
2018/07/16 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
python模块如何查看
2020/06/16 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
小学生放飞梦想演讲稿
2014/08/26 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js