Random 基于Zipf分布的数字生成

Random 基于Zipf分布的数字生成,random,statistics,distribution,zipf,Random,Statistics,Distribution,Zipf,我想为一个小数据集生成一个流行分布,它应该遵循Zipf法则 可用参数为: 观众总数:100万 视频总数:36 我想根据Zipf法则将每个视频的观众总数关联起来。例如,有多少观众将观看video1、video2。。等等。 谁能告诉我公式或方法 维基百科关于齐普夫定律的文章包含了一些关于分布的描述,包括一些计算方法: 理论回顾部分的第一个等式可能会有所帮助。使用此功能,我们可以编写一个简短的Python脚本来关联36个视频中每个视频的总观众数: N_elements = 1000000 video

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

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

我想根据
Zipf
法则将每个视频的观众总数关联起来。例如,有多少观众将观看video1、video2。。等等。

谁能告诉我公式或方法

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

理论回顾部分的第一个等式可能会有所帮助。使用此功能,我们可以编写一个简短的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)
结果总共有100000名观众,但这不是什么大问题。你问,为什么这不是一件大事?看起来,虽然许多不同的事物遵循一般的齐普夫分布,但它们往往根据事物的类型略有不同。video_指数变量可以调整,以便上面模拟的Zipfian分布可以更接近实际视频统计数据。这种差异通常远大于百万分之二


通过查找一些真实排名的视频,并调整视频指数和N\u元素,直到代码与实数匹配,您可以了解真实世界的视频指数是什么。然后,将N_元素重置为1000000,您将拥有一个真实的视频观看数据集。

您的参数看起来很奇怪。请更好地解释一下。另外,解释一下你所说的齐夫定律是什么意思。当然,有很多公式,为什么它们不适合你?你不明白吗?你不明白什么?@addons_zz我想生成一个合成工作负载,我有36个视频,大约100万观众。现在,根据齐夫定律,每段视频被观看的次数是我想要找到的。因此,如果N=100万(意味着有100万观众)k=1..30,则表示K1是视频V1的排名,依此类推。。那么什么是s???正如维基百科中提到的,N是元素的数量;k是他们的等级;s是表征分布的指数值。在这种情况下,我如何计算或选择“s”?您是否可以编辑提供这些新信息的问题,而不是立即将其添加为注释?