python - 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])
你明白,为什么会这样吗?
解决方案
正如错误所暗示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]
推荐阅读
- angular - Protractor 模块 protractor-retry 测试在桌面上运行时不会重新运行并得到 Microsoft JScript 编译错误
- sequelize.js - sequelize(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID 和 defaultValue:Sequelize.DataTypes.UUIDV4 失败
- r - 如何组合具有相同行名但唯一值的小标题行?
- java - 无法通过 mqipt 使用来自 java mq 客户端的 1 个通道将消息并行发送到不同的队列
- c# - C# Nullable:如何从 Dictionary 构建 FormUrlEncodedContent
- bash - 如何将我从 curl -w $ {http_code} 获得的值分配给变量
- java - jackson xmlmapper 动态属性名称
- node.js - 如何在 AWS Elastic Beanstalk 中指定 Procfile 的路径?
- javascript - Html Javascript 动画
- database - foreach() 参数必须是数组|对象类型,给定 null