Генерация номеров на основе Zipf Distribution

Я хочу создать популярный дистрибутив для небольшого набора данных, который должен следовать Zipf закон.

Доступные параметры:
Общее количество зрителей: 1 миллион
Всего видео: 36

Я хочу связать общее количество зрителей с каждым видео в соответствии с Zipf закон. Например, сколько зрителей будут смотреть видео1, видео2 и т. Д.
Может ли кто-нибудь сказать мне формулу или методологию?

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 зрителя, но это не имеет большого значения. Вы спросите, почему это не имеет большого значения? Кажется, что в то время как много различных вещей, следовать общему Zipfian распределения, они имеют тенденцию быть немного отличаться в зависимости от того, какой вещи она. Video_exponent переменный может быть отрегулированы таким образом, что Zipfian распределение моделируется выше, может более точно соответствовать фактическому видео статистики. Разница обычно намного больше, чем 2 из 1000000.

Вы можете получить представление о том, что такое video_exponent в реальном мире, найдя несколько реальных ранжированных видео и настроив video_exponent и N_elements до тех пор, пока код не совпадет с реальными числами. Затем сбросьте N_elements обратно на 1000000, и вы получите реалистичный набор данных для просмотра видео.

Другие вопросы по тегам