python - 使用较大样本的 NumPy 随机抽样比较小样本产生的唯一元素更少
问题描述
我正在尝试构建一个数据集来训练需要正样本和负样本的深度学习模型。对于每个输入列表,我从其余的词汇表中随机选择 3 个元素作为正样本 a 和 k 个元素作为负样本。出于某种原因,最后,当我对每个正样本使用 k=16 个负样本时,我得到的唯一元素比我使用 k=4 的要少,我不确定为什么会这样,因为显然更大的样本应该提供更多覆盖。这是我进行采样的代码(替换值num_neg
以更改采样的负数)。我觉得我可能遗漏了一些明显的东西,但还没有弄清楚......
pos_map = {}
neg_map = {}
num_pos = 3
num_neg = 16
# vocab maps from id => integer index, reverse_map maps from integer index => id. vocab size is ~28k and stores all possible values of id
np.random.seed(2)
for ids in ids_list:
encoded = [vocab[id_] for id_ in ids]
target_positive_indices = np.random.choice(range(len(encoded)), size=num_pos, replace=False)
for target_positive_index in target_positive_indices:
pos = encoded[target_positive_index]
if pos in pos_map:
pos_map[pos] += 1
else:
pos_map[pos] = 1
# perform negative sampling
all_indices = np.arange(vocab_size)
possible_negs = np.random.choice(range(len(all_indices)), size=num_neg * 3, replace=False)
# some negatives chosen could be the same as positives or in the context, filter those out
filtered_negs = np.setdiff1d(possible_negs, store_indexes)[:num_neg]
for n in filtered_negs:
neg = reverse_map[n]
if neg in neg_map:
neg_map[neg] += 1
else:
neg_map[neg] = 1
print(len(neg_map))
num_neg=4 的结果:15842
num_neg=16 的结果:13968
解决方案
推荐阅读
- c# - 在 C# 中创建 Powershell 类的一个实例
- r - 如何检查r中的列表中是否不存在多个元素
- node.js - Angular 无法访问我自己的 API [404(未找到)]
- javascript - axios:获取特定用户的数据
- python - 如何用其他 pytorch 函数替换 torch.norm?
- laravel - 如何在 Livewire 中实现日期选择器?
- java - GridBagLayout 忽略锚点
- pylint - 失败标志不适用于 pylint
- java - Android Studio - getBitmap 不工作。返回 null (Java)
- jenkins - BlueOceanCredentialsProvider 问题