4

我想为一个小数据集生成一个流行度分布,它应该遵循Zipf法律。

可用参数有:
观众总数:100 万
视频总数:36

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

4

1 回答 1

0

关于 Zipf 定律的 Wikipedia 文章包括对分布的一些描述,包括一些计算方法:

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 名观众,但这没什么大不了的。你问,为什么这不是什么大不了的事?似乎虽然许多不同的事物遵循一般的 Zipfian 分布,但它们往往会根据事物的类型而略有不同。可以调整video_exponent变量,以便上面模拟的 Zipfian 分布可以更接近地匹配实际视频统计数据。差异通常远大于 1,000,000 分之 2。

您可以通过查找一些真实排名的视频并调整video_exponentN_elements直到代码与实数匹配,来了解真实世界的video_exponent是什么。然后,将N_elements重新设置为 1,000,000,您将拥有一个真实的视频观看数据集。

于 2020-06-27T02:13:57.720 回答