【问题标题】:Indexing dynamic vector of class probabilities索引类概率的动态向量
【发布时间】:2021-05-17 19:31:14
【问题描述】:

对于我的代码,我有一个大的(最多 40,000 个)类概率向量。这组类概率也需要定期重新加权,因此假设它会在每次调用代码时发生变化。向量总和为 1。我需要有效地搜索与该概率对应的索引。

作为一个例子 - 假设向量是[0.25, 0.25, 0.25, 0.25],4 个对象的均匀概率。我的概率结果是 0.67。这对应于索引 3,因为 0.67 > sum(probvec[0:1])0.67 <= sum(probvec[0:2])

我愿意更改概率向量以使其成为运行总和,即[0.25, 0.5, 0.75, 1],不过我还需要关于如何执行更新的建议。

任何帮助将不胜感激。

【问题讨论】:

  • 我倾向于存储累积总和,您可以通过仅在项目 k 更改时更新总和 k 到 n 来更有效地更新(通过将项目 k 中的更改添加到之后的每个项目) .您实际上不需要对累积和进行归一化,因为您可以在 (0, final sum) 而不是 (0, 1) 中生成一个随机数,然后按照 horcrux 的建议进行二进制搜索。

标签: python python-3.x numpy probability


【解决方案1】:
  • 第 1 步:预先计算所有部分总和,直至 i-th 索引。
  • 第 2 步:使用二进制搜索扫描您的 sums_probvec,以在 logtime 中获取结果。
import numpy as np

probvec = np.full(4, 0.25)
prob = 0.67

# pre-compute all the partial sums up to the i-th index
sum_probvec = [probvec[0]]
for i in range(1, len(probvec)) :
    sum_probvec.append(sum_probvec[i-1] + probvec[i])

# use binary search for logtime results
i = 0
j = len(sum_probvec)
while i != j-1:
    mid = (i + j) // 2
    if prob > sum_probvec[mid]:
        i = mid
    else:
        j = mid
index = i+2

print (index) # 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2020-09-10
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多