首页 > 解决方案 > Numpy random.choice 概率总和不等于 1

问题描述

我想根据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])

你明白,为什么会这样吗?

标签: pythonnumpyrandompytorch

解决方案


正如错误所暗示prob[j]的那样,总和不等于1.

你的 epsilon1e-6太大了,不能被认为是微不足道的,根本不需要这个操作。如果你坚持,你必须在剩下的 1 中重新分配归零的值(看起来你实际上就是这样做的)。

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

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

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

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

推荐阅读