我想为小型数据集生成一个受欢迎程度分布,这应遵循Zipf
定律。
可用参数是:
观众总数:1百万
视频总数:36
我想根据Zipf
法律将每个视频的观看者总数关联起来。例如,有多少观众会观看video1,video2等等
谁能告诉我公式或方法?
答案 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,您将获得一个逼真的视频观看数据集。