浅析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调用windows api锁定计算机示例
Apr 17 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
Python实现翻转数组功能示例
Jan 12 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
python DataFrame 取差集实例
Jan 30 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
Python办公自动化之Excel(中)
May 24 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
Python使用永中文档转换服务
May 06 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP学习笔记(二):变量详解
2015/04/17 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
解放web程序员的输入验证
2006/10/06 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python常见数据结构详解
2014/07/24 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python sorted对list和dict排序
2020/06/09 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
银行求职信个人范文
2013/12/16 职场文书
廉洁使者实施方案
2014/03/29 职场文书
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript