基于Zipf分布的数字生成

时间:2017-01-03 08:12:12

标签: random statistics distribution zipf

我想为小型数据集生成一个受欢迎程度分布,这应遵循Zipf定律。

可用参数是:
观众总数:1百万 视频总数:36

我想根据Zipf法律将每个视频的观看者总数关联起来。例如,有多少观众会观看video1,video2等等 谁能告诉我公式或方法?

1 个答案:

答案 0 :(得分:0)

维基百科有关齐普夫定律的文章包括对分布的一些描述,包括一些计算分布的方法:

https://en.wikipedia.org/wiki/Zipf%27s_law

理论评论部分下的第一个等式可能会有所帮助。使用此工具,我们可以编写一个简短的Python脚本来关联36个视频中每个视频的观看者总数:

N_elements = 1000000
video_exponent = 1

distribution_sum = 0
total_viewers = 0


# First, add up the relative number of viewers across all 36 movie ranks
for k_rank in range(1,36):

    sum = 0
    for n in range(1, N_elements):
        sum = sum + 1/(n**video_exponent)

    distribution_sum = distribution_sum + (1/(k_rank**video_exponent))/sum


# Next, distribute the number of viewers so that the total comes to 1,000,000
print("Movie Rank | # of Viewers")
for k_rank in range(1,36):

    sum = 0
    for n in range(1, N_elements):
        sum = sum + 1/(n**video_exponent)

    viewers_at_k_rank = round((N_elements/(k_rank**video_exponent))/(sum * distribution_sum))

    print(k_rank, end="|")
    print(viewers_at_k_rank)

    total_viewers = total_viewers + viewers_at_k_rank


print("\nSum of all viewers accounted for so far, to make sure we're at 1,000,000")
print(total_viewers)

结果总计有1,000,002位观众,但这并不重要。你问为什么这没什么大不了的?看起来,虽然许多不同的 things 遵循一般的Zipfian分布,但根据它是哪种类型的 thing ,它们往往会略有不同。可以调整 video_exponent 变量,以使上面模拟的Zipfian分布可以更紧密地匹配实际的 video 统计信息。差异通常远远大于1,000,000中的2。

通过找到一些排名靠前的视频,然后调整 video_exponent N_elements ,您可以了解现实世界中的 video_exponent 是什么该代码与实数匹配。然后,将 N_elements 重置为1,000,000,您将获得一个逼真的视频观看数据集。