C++ 具有频繁变化概率的离散分布采样

2024-02-12

问题:我需要从由某些权重构成的离散分布中进行采样,例如{w1,w2,w3,..},因此概率分布为 {p1,p2,p3,...},其中 pi=wi/(w1+w2+...)。

有些wi变化非常频繁,但只占所有wi的比例非常低。但分布本身每次发生时都必须重新规范化,因此我相信 Alias 方法不能有效地工作,因为每次都需要从头开始构建整个分布。

我目前想到的方法是二叉树(堆方法),其中所有wi都保存在最低层,然后在更高层保存每两个的和,依此类推。所有这些的总和将处于最高水平,这也是归一化常数。因此,为了在 wi 发生变化后更新树,需要进行 log(n) 次更改,以及相同数量的更改以从分布中获取样本。

问题:

Q1.您对如何更快地实现它有更好的想法吗? Q2。最重要的部分:我正在寻找一个已经做到这一点的图书馆。

解释:几年前我自己通过在向量中构建堆结构来完成此操作,但从那时起我学到了很多东西,包括发现库(:))和诸如地图之类的容器......现在我需要重写该代码具有更高的功能,这次我想做对:

所以 Q2.1 是否有一种很好的方法来使 C++ 映射不按索引排序和搜索,而是按其元素的累积和进行排序和搜索(这就是我们采样的方式,对吗?..)。 (这是我目前的理论,我想如何做到这一点,但不一定要这样......)

Q2.2 也许有一些更好的方法来做同样的事情?我相信这个问题如此频繁,以至于我很惊讶我找不到某种可以为我做这件事的图书馆......

非常感谢你,如果有人以其他形式问这个问题,我很抱歉,请指导我,但我花了很长时间寻找......

-z

编辑:我可能还需要删除或添加元素,但我think如果这会产生巨大的差异,我可以避免它,从而只需要改变权重的值。

Edit2:权重一般来说是实数,我必须考虑是否可以将它们设为整数......


我实际上会使用字符串的哈希集(不记得它的 C++ 容器,但您可能需要实现自己的容器)。为每个 i 放置 wi 元素,其值是“w1_1”、“w1_2”...一直到“w1_[w1]”(即以“w1_”开头的 w1 元素)。

当您需要采样时,使用均匀分布随机选择一个元素。如果您选择了 w5_*,则假设您选择了元素 5。由于哈希中的元素数量,这将为您提供所需的分布。

现在,当 wi 从 A 变为 B 时,只需将 B-A 元素添加到哈希中(如果 B>A),或者删除 wi 的最后一个 A-B 元素(如果 A>B)。

在这种情况下,添加新元素和删除旧元素是微不足道的。

显然,问题是“随机选择一个元素”。如果您的散列是封闭散列,则您随机选择一个数组单元格,如果它是空的 - 只需再次随机选择一个。如果你的哈希值比权重总和大 3 或 4 倍,那么你的复杂度将会相当不错:检索随机样本需要 O(1),修改权重需要 O(|A-B|)。

另一种选择是,由于只有一小部分权重发生变化,因此将权重分为两部分 - 固定部分和更改部分。那么你只需要关心改变的部分的变化,以及改变的部分的总重量与不变的部分的总重量之间的差异。然后对于固定部分,你的散列变成一个简单的数字数组:1 出现 w1 次,2 出现 w2 次,等等......,选择一个随机固定元素只是选择一个随机数。

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

C++ 具有频繁变化概率的离散分布采样 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 设置 QMessageBox 的父级

    我不明白设置父级有什么好处QMessageBox 例如在以下代码中 void mainWindow showMessage QString msg QMesageBox information this title msg this is
  • 如何创建批处理文件来在Cmder中执行命令?

    我想创建一个启动 Cmder 的批处理文件 然后在 Cmder 中执行一些命令 我知道如何使用批处理文件启动 Cmder 但不知道如何使用批处理文件在 Cmder 中编写 执行命令 我尝试这个 echo off cd C Program F
  • 将 html 内联图像从浏览器复制/粘贴到文字处理器

    我正在尝试使用 html 内联图像 背景 尝试创建我自己的 CMS 它不会将图像保留为单独的文件 我可以将此类图像从浏览器 Firefox IE 复制 粘贴到 Photoshop 或 MS Paint 等图像处理程序 但不能复制到 MS W
  • 使用 svn+ssh 协议通过 2 跳访问 Subversion 存储库

    我的 Ubuntu Subversion 服务器无法直接访问互联网 192 168 1 2 我的公共 Ubuntu 机器通过 DMZ 暴露在 192 168 1 1 我已经设置了从 192 168 1 1 3906 到 192 168 1
  • C 中的“double”运算和优化

    我最近分析了一段用 VS2005 编译的旧代码 因为 调试 无优化 和 发布 O2 Oi Ot 选项 编译中的数值行为不同 简化的 代码如下所示 void f double x1 double y1 double x2 double y2
  • YII 2.0 GridView 更新

    我在通过 javascript 更新 yiigridview 时遇到问题 我正在尝试以 yii 1 1 方式使用它 jQuery fn yiigridview update grid id 但这给我带来了错误 undefined is no
  • 管道阶段规范对象必须恰好包含一个带有 php mongo 聚合的字段

    我正在尝试将聚合与项目 匹配和排序一起使用 但出现异常 MongoResultException准确地说 说 exception A pipeline stage specification object must contain exac
  • php oop 从同一类的方法内部调用方法

    我有以下问题 class class name function b do something function c function a call function b 当我像往常一样调用函数时 this gt b 我收到此错误 Usin
  • 如何避免页面刷新时的按钮事件

    我有 aspx 页面 该页面通过单击按钮将数据插入数据库 但当我按下按钮时 它就正常了 我收到 成功插入数据 的成功消息 在这种情况下 如果我按 F5 或刷新页面 它将触发按钮单击事件 为什么应该是这样 如何避免这种情况 When the
  • 如何在Python中检查字符串是否只包含数字或“/”?

    我正在尝试检查字符串是否仅包含数字或 以用作验证形式 但是我找不到同时执行这两项操作的方法 自动取款机我有这个 if variable isdigit False 这适用于数字 但我还没有找到一种方法来检查斜杠 有很多选项 如此处所示 列表
  • 通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔字母的问题

    我在远程主机上的 Ubuntu 12 04 LTS 和 MSSQL 2008 上使用 django pyodbc 作为数据库后端 除了返回西里尔字母符号外 它的效果很好 我看到的不是它们 而是问号 我已经开始调查可能导致此问题的原因 据我了
  • java打印阶乘计算过程

    您好 我需要打印阶乘计算过程 例如 如果用户输入的是5 系统应该打印出 5 4 3 2 1 120 我有这个代码 public static void factorial Scanner sc new Scanner System in i
  • 带有绿色复选标记的控制台消息 JavaScript

    我想知道控制台中是否有可能有一个绿色复选标记 就像 console warn 有黄色警告标志 console error 有红色错误标志一样 我在网上搜索过是否有类似的功能 但没有找到 现在我正在寻找一种方法将图标放在console log
  • 为什么在计时器回调中调用事件会导致以下代码被忽略?

    我正在编写一个简单的游戏 使用来自system threading命名空间来模拟操作的等待时间 我的目标是让计时器每秒执行一次 持续 x 秒 为了实现这一点 我在计时器回调中添加了一个计数器 问题是我在调用后放置的任何代码DeliveryP
  • 从 testNG 测试中检索 @Test 描述

    我的 testNG 测试有以下格式 Test alwaysRun true dependsOnMethods testStep 1 description Enter the names and verify that they are a
  • 如何在不循环的情况下一次为多个数组索引赋值?

    如何在 C 中为数组的多个元素设置一个值 Example 我有一个数组初始化如下 int array new int 2 3 5 3 7 2 9 我想将第二个和第五个索引之间的值设置为 8 怎样才能做到呢 好吧 如果你想变得可爱 你可以创建
  • Python 中内置最大堆 API

    默认 heapq 是最小队列实现 想知道是否有最大队列的选项 谢谢 我尝试使用 heapify max 作为最大堆的解决方案 但如何动态处理推送 弹出元素 看来 heapify max 只能在初始化时使用 import heapq def
  • C# 计算两个纬度/经度点之间沿大圆路径的 n 个点数

    我正在将具有纬度和经度值的机场之间的飞行路径绘制到 Google 地图 API v3 上 然而 与 v2 不同的是 v3 似乎没有选项可以在地图上两点之间放置折线并将其显示为大圆飞行路径 所以我的想法是 也许可以计算两个纬度 经度点之间的大
  • 如何将 Perl 嵌入到 C++ 应用程序中?

    我想从我的 C 程序中调用 Perl 脚本文件 我不确定我将分发给的人是否会安装 Perl 基本上 我正在寻找一个可以使用的 lib 文件 该文件具有类似 Apache 的分发许可证 您可以将 Perl 嵌入到您的应用程序中 Perl 嵌入
  • C++ 具有频繁变化概率的离散分布采样

    问题 我需要从由某些权重构成的离散分布中进行采样 例如 w1 w2 w3 因此概率分布为 p1 p2 p3 其中 pi wi w1 w2 有些wi变化非常频繁 但只占所有wi的比例非常低 但分布本身每次发生时都必须重新规范化 因此我相信 A