【发布时间】:2018-09-28 21:42:48
【问题描述】:
我有两个列表,大小相同,我们称它们为elements 和weights。我想选择elements 列表中的一个 元素具有由weights 给出的离散概率分布。 weight[i] 对应于选择elements[i] 的概率。 elements 永远不会改变,但在每次采样后,weights 都会改变(只有值,而不是大小)。
我需要一种高效的方法来处理大型列表。
我在 Python 中有一个使用 numpy.random.choice(elements, p=weights) 的实现,但从一组大小 n 中抽取大小为 k 的样本,其中 k << n 效率极低。欢迎使用任何语言的实现,但我主要使用 Python 工作。
(这用于与 networkx 的社交网络模拟。我有一个加权图和一个节点 i,我想从 i 的邻居中选择一个节点 j其中每个节点的概率与i和给定节点之间的边的权重成正比。如果我将非邻居的概率设置为0,我不必每次都生成邻居列表,我只需要一个所有节点的列表。)
会这样使用:
elements = [...]
weights = [...]
for(...):
element = sample(elements, weights)
*Some calculation with element and changing the values of weights*
【问题讨论】:
-
权重没有标准化,对吧?
-
默认没有。我用
sum()将它们标准化,然后是列表理解。 -
而且很多都是零,对吧?
标签: python performance numpy random probability