首页 > 解决方案 > 使用较大样本的 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

标签: pythonnumpymachine-learningdata-science

解决方案


推荐阅读