iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅析Python中的随机采样和概率分布
  • 489
分享到

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

2024-04-02 19:04:59 489人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. random.choice2. random.choices(有放回)3. numpy.sample(无放回)4.rng.choices 和 rng.sample5. nu

 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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅析Python中的随机采样和概率分布

本文链接: https://www.lsjlt.com/news/159178.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析Python中的随机采样和概率分布
    目录1. random.choice2. random.choices(有放回)3. numpy.sample(无放回)4.rng.choices 和 rng.sample5. nu...
    99+
    2024-04-02
  • Python随机采样及概率分布(二)
    目录1. 二项(binomial)/伯努利(Bernoulli)分布1.1 概率质量函数(pmf)1.2 函数原型1.3 使用样例2. 多项(multinomial)分布2.1 概率...
    99+
    2024-04-02
  • Python实现从概率分布中随机采样
    目录1. 二项(binomial)/伯努利(Bernoulli)分布2. 多项(multinomial)分布3.均匀(uniform)分布4. 狄利克雷(Dirichlet)分布参考...
    99+
    2024-04-02
  • Python中如何实现随机采样和概率分布
    这篇文章主要介绍了Python中如何实现随机采样和概率分布,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Python(包括其包Numpy)中包含了了许多概率算法,...
    99+
    2023-06-21
  • Python如何实现随机采样及概率分布
    这篇文章主要介绍了Python如何实现随机采样及概率分布,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 二项(binomial)/伯努利(Bernoulli)分布1.1 ...
    99+
    2023-06-22
  • Python如何绘制概率分布直方图浅析
    目录前言一、代码二、运行效果总结前言 直方图是一个可以快速展示数据概率分布的工具,直观易于理解,并深受数据爱好者的喜爱。大家平时可能见到最多就是 matplotlib,seaborn...
    99+
    2024-04-02
  • 多核编程中的线程随机竞争模式的概率分析
    这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!并 不是...
    99+
    2024-04-02
  • Python中图片采样处理的示例分析
    这篇文章给大家分享的是有关Python中图片采样处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.图像采样处理原理图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M&...
    99+
    2023-06-29
  • Python中关于数据采集和解析是怎样的
    本篇文章为大家展示了Python中关于数据采集和解析是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们已经了解到了开发一个爬虫需要做的工作以及一些常见的问题,下面我们给出一个爬虫开发相关技术...
    99+
    2023-06-02
  • Python 和 JavaScript 在 Spring 分布式应用中的角色分析
    Spring 是一种非常流行的 Java 框架,它的主要作用是简化企业级应用程序的开发。在 Spring 应用程序中,Python 和 JavaScript 都扮演着重要的角色。本文将分析 Python 和 JavaScript 在 Sp...
    99+
    2023-08-06
    spring 分布式 javascript
  • 如何在Python中实现一个分布式计算框架,以及任务调度和结果收集的机制和策略
    标题:Python中的分布式计算框架实现及任务调度与结果收集机制摘要:分布式计算是一个有效利用多台计算机资源来加速任务处理的方法。本文将介绍如何使用Python实现一个简单的分布式计算框架,包括任务调度和结果收集的机制与策略,并提供相关代码...
    99+
    2023-10-22
    分布式计算 任务调度 结果收集
  • python机器学习中朴素贝叶斯算法及模型选择和调优的示例分析
    这篇文章将为大家详细讲解有关python机器学习中朴素贝叶斯算法及模型选择和调优的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、概率知识基础1.概率概率就是某件事情发生的可能性。2.联合概率包...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作