You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python/Numpy按指定共现概率抽取100组索引元组?

解决方法:用Python/Numpy生成符合指定共现概率的索引元组

嘿,这个问题很实用!不过先提个小细节:你给出的四个共现概率加起来是0.8+0.7+0.1+0.1=1.7,这不符合概率分布的基本要求(所有可能结果的概率总和必须为1)。所以我们需要先把这些概率归一化,保留你指定的相对概率比例,这样才能正确抽样。

下面是具体的实现步骤和代码:

步骤说明

  1. 明确需要抽样的共现元组(这里按无序对处理,也就是(1,2)和(2,1)视为同一个共现结果;如果需要有序对可以调整)
  2. 对原始概率进行归一化处理,确保总和为1
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:48:16