我想根据给定行的prob指定的概率分布随机选择样本点。但是,我在np.random.choice中得到一个错误,即概率未加到1。这很奇怪,因为我首先沿行使用L1-范数进行归一化,然后如果值小于,则定义一个均匀分布。阈值1e-6。

import numpy as np
import torch.nn.functional as F

prob = F.normalize(outputs, p=1, dim=1).clone().data.cpu().numpy() # outputs is a torch.Tensor of shape (14, 6890)
all_zero = np.where(prob.max(1) < 1e-6)[0] # find indices of rows where all values are smaller
prob[all_zero] = np.full(prob.shape[1], 1 / prob.shape[1]) # fill those rows uniformly
# ... somewhere later inside a method
for j in range(14):
    sample = np.random.choice(6890, 4, replace=False, p=prob[j])


您知道为什么吗?

最佳答案

由于错误提示,prob[j]并不等于1

您的epsilon 1e-6太大,以至于可以忽略不计,根本不需要此操作。如果您坚持要保留,则必须在剩下的1上重新分配零散列值(看来您实际上就是这样做的)。

总而言之,您没有将数组标准化为1:

prob /= prob.sum(axis=1) # make it prob dist


顺便说一句。广播会将您的单个号码扩展到整行,无需np.full

prob[all_zero] = 1 / prob.shape[1]

关于python - Numpy random.choice概率总和不超过1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57855659/

10-13 07:13