关于 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 分布可以更接近地匹配实际 video 统计数据。差异通常远大于 1,000,000 分之 2。
您可以通过查找一些真实排名的视频并调整 video_exponent 和 N_elements 直到该代码与实数匹配。然后,将 N_elements 重置为 1,000,000,您将拥有一个真实的视频观看数据集。