我想根据prob
为给定行指定的概率分布随机选择样本点。但是,我在np.random.choice
中得到一个错误,即概率未加到1。这很奇怪,因为我首先沿行使用L1-范数进行归一化,然后在值等于1时定义一个均匀分布。小于阈值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])
您了解为什么吗?
答案 0 :(得分:2)
错误提示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]