如何用Python/Numpy按指定共现概率抽取100组索引元组?
解决方法:用Python/Numpy生成符合指定共现概率的索引元组
嘿,这个问题很实用!不过先提个小细节:你给出的四个共现概率加起来是0.8+0.7+0.1+0.1=1.7,这不符合概率分布的基本要求(所有可能结果的概率总和必须为1)。所以我们需要先把这些概率归一化,保留你指定的相对概率比例,这样才能正确抽样。
下面是具体的实现步骤和代码:
步骤说明
- 明确需要抽样的共现元组(这里按无序对处理,也就是(1,2)和(2,1)视为同一个共现结果;如果需要有序对可以调整)
- 对原始概率进行归一化处理,确保总和为1
- 使用Numpy的
random.choice工具按归一化后的概率抽样100次
完整代码
import numpy as np # 1. 定义目标共现元组和原始概率 cooccurrence_pairs = [(1, 2), (3, 4), (1, 3), (2, 4)] raw_probabilities = [0.8, 0.7, 0.1, 0.1] # 2. 归一化概率,确保总和为1 normalized_probs = np.array(raw_probabilities) / np.sum(raw_probabilities) print(f"归一化后的概率:{normalized_probs.round(4)}") # 保留四位小数方便查看 # 3. 抽样100组 # 先对元组的索引抽样,再映射回对应的元组 sample_indices = np.random.choice(len(cooccurrence_pairs), size=100, p=normalized_probs) sampled_pairs = [cooccurrence_pairs[idx] for idx in sample_indices] # 可选:查看前10个抽样结果 print("\n前10个抽样结果:") for pair in sampled_pairs[:10]: print(pair)
额外说明
- 如果需要有序共现对(比如(1,2)和(2,1)是两个不同的结果),只需要修改
cooccurrence_pairs列表,比如添加(2,1)、(4,3)等,并调整对应的原始概率即可(比如把(1,2)的0.8拆成(1,2)和(2,1)各0.4)。 - Numpy的
random.choice比Python标准库的random.choices更适合大样本量的抽样,效率更高。
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

