我想根据给定行的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/