|
|
1
41
否则你可以用一些 roulette-wheel selection 过程。看到这个了吗 similar question
说明:
考虑区间[0,1]。我们为列表中的每个元素赋值(
现在,如果我们在[0,1]上生成一个均匀分布的随机数,那么[0,1]中的任何一个数都有相等的被选取概率,因此子区间的长度决定了随机数落在每个区间中的概率。
这符合我上面所做的:选择一个数字X~U[0,1](更像
您可以通过生成足够大的序列来检查上述两种技术的结果
多少与标准化权重匹配
|
|
|
2
17
amro给出了一个很好的答案(我对此进行了评价),但是如果您希望从一个大的集合中生成许多数字,那么它将是高度密集的。这是因为bsxfun操作可以生成一个巨大的数组,然后对其求和。例如,假设我有一组10000个值要从中采样,所有这些值都具有不同的权重?现在,从这个样本中生成1000000个数字。 这需要做一些工作,因为它将在内部生成一个10000x1000数组,其中包含10^10个元素。它将是一个逻辑阵列,但即便如此,也必须分配10gb的ram。 更好的解决方法是使用histc。因此。。。
然而,对于我上面建议的一个大问题,它是快速的。
诚然,我的版本需要两行字。索引操作必须发生在第二行,因为它使用histc的第二个输出。还要注意的是,我使用了新的matlab版本的功能,将tilde(~)操作符作为histc的第一个参数。这将导致第一个参数立即转储到位桶中。 |
|
|
3
3
热释光;博士为了获得最佳性能,如果您只需要一个样本,请使用
如果你需要多个样品,使用
避免
绩效指标由于这显示在我的Google搜索的顶部,我只想添加一些性能指标来说明正确的解决方案在很大程度上取决于N的值和应用程序的需求。另外,更改应用程序的设计可以显著提高性能。
对于大型
在这种情况下,
然而,在可能不可能预先生成所有N个值的情况下,可能是因为权重在每次迭代时被更新,即。
在这种情况下
无论如何,
here . |
|
|
4
2
Gnovice's answer ,用游程编码模式实现轮盘赌算法是有意义的。我使用Amro的解决方案和新代码执行了一个基准测试:
对于PDF域包含巨大长度的非常大的数据,上面代码的一些计算。
它是内存密集型的,但是使用这种方法甚至可以扩展到几十万的PDF长度。因此访问速度非常快。 |