有放回抽样ID直至收集全部个体的模拟与可视化需求
ID有放回抽样累计唯一个体数的模拟与可视化方案
1. 数据预处理
先把ID-个体映射数据整理好,用Python的pandas库加载处理(实际数据可替换为你的文件路径):
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载示例数据(实际场景替换为你的数据文件,比如pd.read_csv("your_data.csv")) data = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7], 'individual': ['A','B','A','C','D','D','D'] }) # 建立ID到个体的映射字典 id_to_individual = data.set_index('ID')['individual'].to_dict() # 获取所有唯一个体的总数(用于绘制渐近线) total_unique_individuals = len(set(data['individual'])) # 提取所有ID作为抽样池 id_pool = data['ID'].tolist()
2. 1000次有放回抽样模拟
核心逻辑是每次从ID池随机抽取一个ID,对应到个体后记录累计收集到的唯一个体数量:
# 初始化变量:已收集的个体集合、累计数量记录列表 collected_individuals = set() count_record = [] # 执行1000次有放回抽样 for _ in range(1000): # 随机抽取一个ID sampled_id = np.random.choice(id_pool, replace=True) # 获取对应的个体 sampled_individual = id_to_individual[sampled_id] # 将个体加入已收集集合(自动去重) collected_individuals.add(sampled_individual) # 记录当前累计的唯一个体数 count_record.append(len(collected_individuals))
3. 可视化结果
绘制抽样次数与累计唯一个体数的趋势图,并添加全个体数的渐近线:
plt.figure(figsize=(10,6)) # 绘制累计数量变化曲线 plt.plot(range(1, 1001), count_record, label='累计唯一个体数') # 绘制全个体数的渐近线 plt.axhline(y=total_unique_individuals, color='r', linestyle='--', label=f'全部个体数({total_unique_individuals})') # 设置图表标签与样式 plt.xlabel('ID抽样次数') plt.ylabel('累计唯一个体数') plt.title('1000次有放回抽样累计唯一个体数变化趋势') plt.legend() plt.grid(alpha=0.3) plt.show()
结果说明
- 曲线前期上升较快,随着抽样次数增加,会逐渐逼近全个体数,最终趋于平稳(与红色虚线重合)
- 横轴严格对应ID抽样次数(1到1000),而非唯一ID数量,完全匹配需求
- 由于抽样的随机性,每次运行的曲线会有细微差异,但整体趋势一致:从快速收集新个体到逐渐饱和
内容的提问来源于stack exchange,提问作者kalex
相关产品推荐
相关产品推荐

