繁体   English   中英

使用numpy生成随机的馆藏集合

[英]Generating random sets of holdings using numpy

我需要为可以持有多个馆藏的用户生成多个(例如100 000个)随机的馆藏集。 对于任何给定的用户,这些持有量之和必须为1。理论上,可以用numpy轻松地生成这些随机持有量:

num_users = 100000
num_holdings = 8

random_holdings = np.random.rand(num_users, num_holdings)
random_holdings /= np.sum(random_holdings, axis=1, keepdims=True)

这给了我们

random_holdings
array([[0.044, 0.169, 0.204, ..., 0.051, 0.116, 0.176],
       [0.132, 0.078, 0.23 , ..., 0.102, 0.028, 0.204],
       [0.036, 0.182, 0.165, ..., 0.138, 0.065, 0.04 ],
       ...,
       [0.195, 0.028, 0.136, ..., 0.147, 0.113, 0.22 ],
       [0.19 , 0.237, 0.061, ..., 0.23 , 0.109, 0.046],
       [0.181, 0.111, 0.1  , ..., 0.166, 0.126, 0.199]])

这样做的问题是,它导致许多类似的馆藏集和相对较少的集中馆藏集。 例如:

len(np.where(random_holdings > 0.5)[0])

给出的结果为24,即在全部100000中只有24个持有量大于0.5。

有人可以推荐一种更好的随机方法还是一种更明智的整体方法,这样我拥有的相似持股量会更少,而集中持股量会更集中?

谢谢!

您要求“更好的随机化方法”,但是“更好”的定义并不明确。 如果您只想要一些可以使持股量更加极端变化的东西 ,可以尝试

random_holdings = np.random.pareto(1, size=(num_users, num_holdings))

然后像您已经做的那样标准化。

pareto的第一个参数控制分布的形状。 使用较大的值可以减少馆藏的极端变化。 您还可以尝试其他重尾分布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM