【问题标题】:How to build a vector of marginal probabilities, given a tensor in PyTorch给定 PyTorch 中的张量,如何构建边际概率向量
【发布时间】:2022-01-22 00:51:12
【问题描述】:

在 PyTorch 中给定一个张量,如何构建边际概率向量

我有一个形状为 [Dim1: , Dim2: ] 的张量“A”,Dim1 中的每个元素都是从未知分布中提取的,我需要检查 Dim2 向量是否之前出现在其他 128 个样本。如果有,则该元素的边际概率增加 1 并记录在另一个形状为 [DimB: ] 的张量“B”中。迭代完成后,我将 B 中的所有元素除以 128(可能性的数量)以实现加权增量,因此目标是随着 Dim1 大小的增加接近真实分布。

如何在 PyTorch 中直接实现?我尝试使用有序词典,但速度太慢。我假设存在一种方法可以直接在 PyTorch 中完成

如果我们有一个形状为 [Dim1: , Dim2: ] 的张量 T1,我使用有序字典的粗略方法:

from collections import OrderedDict
od = OrderedDict()
T1 = torch.Tensor([[2.4, 5.5,1],
                   [3.44,5.43,1],
                   [2.4, 5.5,1],
                   [3.44,8.43,1],
                   [3.44,5.43,9],
                   [3.44,5.43,1], ])
print ('T1 shape',T1.shape) # -> T1 shape torch.Size([6, 3]) 
for i in range(T1.shape[0]):
    key = ''.join([ str(int(j)) for j in T1[i].tolist()]) # creates a unique identifier (is there a better way to do this?)
    if key in od:
        od[key] +=1
        key_place_holder = key + str(od[key]) # unique identifier if we found duplicate to keep a 0 in the final tensor
        od[key_place_holder] = 0
    else:
        od[key] = 1
print ('len od',len(od)) # -> len od 6
list_values = [j/len(od) for i,j in od.items()] 
T1_marginal_probabilities = torch.Tensor(list_values)
print ('Marginal Probs',T1_marginal_probabilities) # -> Marginal Probs tensor([0.3333, 0.3333, 0.0000, 0.1667, 0.1667, 0.0000])

最终输出如预期,因为[2.4, 5.5,1] 和[3.44,5.43,1] 的概率都是2/6,因为我们在位置重复了[2.4, 5.5,1] 2 次0 和 2。而 [3.44,5.43,1] 在位置 1 和 5 重复。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您可以使用torch.uniquetorch.nonzero

    T1 = ...
    values, inverse, counts = T1.unique(dim=0, return_inverse=True, return_counts=True)
    
    ps = torch.zeros(inverse.numel())
    for i, (v, c) in enumerate(zip(values, counts)):
        first_occurence = torch.nonzero(inverse == i)[0].item()
        ps[first_occurence] = c
    ps /= ps.sum()
    

    【讨论】:

    • 如果我设置dim=0就可以了,但是,你知道这是否可以扩展到更高的维度吗?例如,如果 T1 的形状为 [ Dim1 , Dim2 , Dim3: , Dim4: ],我已经尝试过这样做,但我很快就遇到了嵌套 3 个问题for 循环,因为我需要遍历 dim1、dim2 和(值计数)。
    • 谢谢,我已更正错字。我不认为它可以直接完成,它需要对 for 循环进行矢量化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多