为什么 numpy.random.choice 不使用算术编码?

2023-11-29

如果我评估类似:

numpy.random.choice(2, size=100000, p=[0.01, 0.99])

使用一个均匀分布的随机数float, say r,并决定是否r < 0.01可能会浪费许多生成的随机位(熵)。我听说(二手)生成伪随机数的计算成本很高,所以我假设numpy不会这样做,而是会使用类似的方案算术编码在这种情况下。

然而,一开始glance看起来choice确实生成了float对于每个需要的样品。此外,快速timeit实验表明,生成n均匀浮动实际上比n样本来自p=[0.01, 0.99].

>>> timeit.timeit(lambda : numpy.random.choice(2, size=100000, p=[0.01, 0.99]), number=1000)
1.74494537999999
>>> timeit.timeit(lambda : numpy.random.random(size=100000), number=1000)
0.8165735180009506

Does choice真正生成一个float对于每个样本,它会出现什么?在某些情况下(特别是如果size很大并且p分布不均匀)?如果没有,为什么不呢?


从 NumPy 1.17 开始,原因很大程度上是向后兼容性。也可以看看这个问题 and 这个问题.

从 NumPy 1.17 开始,numpy.random.*功能,包括numpy.random.choice,是遗留功能,并且“应保持与当前相同”,根据NumPy 的新 RNG 政策,其中还引入了NumPy 的新随机生成系统。使它们成为遗留功能的原因包括避免全局状态的建议。然而即便如此,NumPy 并没有弃用任何numpy.random.*尽管 NumPy 的未来版本可能会在 1.17 版本中起作用。

回想一下,在你的例子中,numpy.random.choice需要一个数组floats 作为权重。整数权重数组将导致更精确的随机数生成。并且虽然任何float可以转换为有理数(导致有理值权重,从而产生整数权重),旧的 NumPy 版本似乎不这样做。这些和其他实施决定numpy.random.choice在不破坏向后兼容性的情况下无法更改。

顺便说一句,算术编码并不是唯一试图避免浪费比特的算法。也许离散分布采样的规范算法是 Knuth 和 Yao 算法(1976),该算法根据所涉及概率的二元展开精确地选择一个随机整数,并将问题视为二叉树上的随机游走。 (该算法平均使用距理论下界最多 2 位的数据。)任何其他整数生成算法最终都可以用相同的方式描述,即二叉树上的随机游走。例如,快速加载骰子滚轴是一种最新算法,其使用的平均位数有一个有保证的界限(在本例中,距理论下限不超过 6 位)。 Han 和 Hoshi 算法(1997 年)是另一种此类算法,但使用累积概率。另请参阅我的部分,“加权选择与替换".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 numpy.random.choice 不使用算术编码? 的相关文章

随机推荐

  • 使用 Ipython 退出脚本时不调用 atexit 函数

    下面是在 test atexit py 脚本中编写的代码 def exit function print I am in exit function import atexit atexit register exit function p
  • 便携式 C SWAP 宏,不需要“type”参数,也不使用 memcpy

    采用某种类型的交换宏是众所周知的 define SWAP type a b do type SWAP a a b b SWAP a a b b SWAP while 0 also 宏 SWAP t x y 交换两个类型 t 的参数 是否可以
  • 如何检查电话号码是否是 Android 中有效的 Whatsapp 号码?

    所以我有一个编辑文本 将用作从用户获取电话号码的视图 假设电话号码是 6123456789 我想检查这个号码是否有whatsapp号码 我想避免用户输入假的whatsapp号码 怎么办 更新 2022 年 11 月 Whatsapp 从 v
  • 线程有多贵?

    操作系统本机线程有多贵 主机操作系统为线程堆栈分配一些虚拟内存 并为线程控制结构分配一点内核内存 我错过了什么吗 它会增加调度程序的工作负载 具体取决于线程的繁忙程度以及调度程序的类型 它还将为堆栈的第一页分配物理内存 在许多情况下 主要成
  • 是否存在从 HTML 属性名称到 DOM 属性名称的映射?

    in HTML td style background color pink hello world td 但在 Javascript DOM 中 var td document createElement td td colSpan 3
  • 如何从接口访问嵌套的可选索引

    鉴于以下接口描述这个TS游乐场 export type GetTestimonialsSectionQuery typename Query testimonialsSection typename TestimonialsSection
  • 无法实例化类...;没有空构造函数

    当我运行我的PaintView java 我在 logcat 中收到以下错误 即无法实例化类com example connectthedots PaintView 没有空的构造函数 07 22 18 47 43 453 D dalvikv
  • 无法关闭 Tomcat web 应用程序中的 Neo4j Jetty 服务器

    目前我正在开发一个使用 Neo4j 的网络应用程序 我们的应用需要部署在Tomcat环境中 客户要求 我们决定嵌入 Neo4j 因为这样我们就可以使用 Neo4j 提供的 Java API 更容易部署 并且性能得到提高 但是 我们还需要访问
  • Android:闹钟每 30 分钟播放一次,从 12:30 开始

    这里我将使用闹钟服务每 30 分钟播放一次闹钟 现在我已将其设置为从 Every start 开始每 10 秒播放一次 这是代码 Override public void onCreate Bundle savedInstanceState
  • 将非常大的 JSON 文件转换为 CSV

    我有一个大小约为 8GB 的 JSON 文件 当我尝试使用此脚本转换文件时 import csv import json infile open filename json r outfile open data csv w writer
  • 如何在 php 中创建安全的 mysql 准备语句?

    我是在 mysql 和 php 中使用准备好的语句的新手 我需要一些帮助来创建准备好的语句来检索列 我需要从不同的列获取信息 目前对于测试文件 我使用完全不安全SQL语句 qry SELECT FROM mytable where user
  • 有什么方法可以使用给定的索引节点号搜索文件或文件名吗?

    我正在从用户那里获取索引节点号 并且必须在文件系统中搜索该文件 如何搜索 inode 编号 我必须使用 C 和 unix 来完成此操作 到目前为止 这是我的代码 include
  • 链接命名范围未按预期工作

    我有两个简单的命名范围定义如下 class Numbers lt ActiveRecord Base named scope even conditions gt title gt 2 4 6 named scope odd conditi
  • 通过 grep 两次管道尾部输出

    使用典型的 Apache 访问日志 您可以运行 tail f access log grep 127 0 0 1 它只会显示指定 IP 地址的日志 创建时 但是为什么当你通过管道传输时会失败grep第二次 进一步限制结果 例如 css 的简
  • 移动平均查询 MS Access

    我正在尝试计算数据的移动平均值 我用谷歌搜索并在这个网站和其他网站上找到了很多例子 但我仍然感到困惑 我需要计算为特定产品选择的记录的前 5 个流量的平均值 我的表如下所示 TMDT Prod Flow 8 21 2017 12 01 00
  • 使用图像模块(python)将希伯来语文本绘制为图像

    这是我已经问过的一个问题 并且有几个得到了答案 但问题仍然存在 当我尝试使用图像模块用希伯来语写入图像时 我得到的不是希伯来语字母而是其他 ascii 字母 如果我转换为 unicode 或 ascii 我会收到一个它不支持的错误 我在这里
  • Windows TCP 套接字默认启用 SO_KEEPALIVE 吗?

    我在 TCP 套接字方面遇到了一个奇怪的错误 看起来SO KEEPALIVE默认情况下在所有套接字上启用 我编写了一个简短的测试用例来创建套接字并连接到服务器 连接后 我立即检查SO KEEPALIVE with getsockopt 该值
  • 转换元组类型

    所以我是提升 MPL 的新手 我不知道如何将它与标准类型一起使用 我想要一个隐藏这种类型的元函数 std tuple
  • FLOT 趋势线

    包括我jquery flot trendline js 从这里 这是我的代码 plot placeholder seriesdata series trendline show true lineWidth 2 fill true fill
  • 为什么 numpy.random.choice 不使用算术编码?

    如果我评估类似 numpy random choice 2 size 100000 p 0 01 0 99 使用一个均匀分布的随机数float say r 并决定是否r lt 0 01可能会浪费许多生成的随机位 熵 我听说 二手 生成伪随机