如何用NumPy实现生成模拟人群手机每日拿起次数的函数
实现方案说明
首先纠正你对函数参数的误解:从给定的测试代码可以看出,get_population的三个参数分别是:
- 第一个参数
pickups:期望的总体均值(测试用例传入45,断言要求返回的总体均值和45的差值小于0.5) - 第二个参数
pop_size:总体的个体数量(测试用例传入5000) - 第三个参数不是标准差,是随机种子(测试用例传入42,用来固定随机生成结果,保证断言可稳定通过)
另外你提到用np.random.randint是不合适的,均匀分布生成的整数无法满足「标准差接近均值的平方根」的要求。结合拿起手机次数是离散计数类数据的特征,以及测试断言要求pop_std ≈ np.sqrt(45),正好匹配泊松分布的特性:泊松分布的均值和方差相等,标准差就是均值的平方根,完全符合需求。
完整实现代码
import numpy as np def get_population(pickups, pop_size, random_seed): # 设置随机种子保证结果可复现 np.random.seed(random_seed) # 用泊松分布生成每个个体的每日拿起手机次数,λ为期望均值pickups pop_pickups = np.random.poisson(lam=pickups, size=pop_size) # 计算总体均值 pop_mean = np.mean(pop_pickups) # 计算总体标准差(ddof=0代表总体标准差,不是样本标准差) pop_std = np.std(pop_pickups, ddof=0) return pop_pickups, pop_mean, pop_std
验证说明
你可以直接运行给定的测试代码:
pop_pickups, pop_mean, pop_std = get_population(45, 5000, 42) assert np.abs(pop_mean - 45) < 0.5, "Get population problem, testing pop_mean, population mean returned does not match expected population mean" assert np.abs(pop_std - np.sqrt(45)) < 0.5, "Get population problem, testing pop_std, population standard deviation returned does not match expected standard deviation"
运行后不会触发断言报错,完全符合测试要求。生成的pop_pickups就是长度为5000的数组,每个元素对应一个个体每日拿起手机的次数,可以直接用于后续的抽样作业。
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

