Реализация совместного распределения вероятностей в питоне: шары и корзины - PullRequest
0 голосов
/ 30 октября 2019

Есть n корзин с несколькими шариками в них, где количество шариков в корзинах соответствует степенному распределению p_1 с показателем gamma_1, т.е. есть несколько корзин с большим количествомшары, в то время как большое количество бункеров имеют только несколько шаров. Кроме того, шары окрашены, где цвета шаров также соответствуют степенному распределению p_2 с другим показателем степени gamma_2. Так что, в принципе, мне нужно реализовать совместное распределение вероятностей в Python.

Пока что, пользуясь некоторой помощью от (в Excel), случайно генерирующего распределение степенного закона Я реализовал следующую функцию, чтобы сначала назначить количество шаров (простых шаров) для бинов, следующих застепенное распределение. После вычисления количества шаров в каждой ячейке по степенному закону я затем использую аналогичную функцию, чтобы назначить цвета этим шарам, используя показатель степени gamma_2.

def get_PL_sequence(how_many_bins, x_min, gamma):

    numbers_as_per_PL = []
    unique_numbers = [] #i.e. bins
    bins = 0
    while(bins < how_many_bins):
        num = int(x_min*random.random()**(-1/gamma))
        if(num not in unique_numbers):
            unique_numbers.append(num)
        numbers_as_per_PL.append(num)
        bins = len(unique_numbers)

    dict_num_freq = {}
    for each in unique_numbers:
        cnt = numbers_as_per_PL.count(each)
        dict_num_freq[each] = cnt

    list_sorted_tuples = sorted(dict_num_freq.items(), key=lambda item: item[1], reverse = True) #tuple = (number, number_of_times)

    i = 1 #numbering will start from 1
    renaming_dict = {} #for renaming bins. Key: old bin number, Value: new bin number
    for tuple1 in list_sorted_tuples:
        renaming_dict[tuple1[0]] = i
        i += 1

    for i in range(len(numbers_as_per_PL)):
        numbers_as_per_PL[i] = renaming_dict[numbers_as_per_PL[i]]

    new_unique_numbers = list(set(numbers_as_per_PL))
    new_list_sorted_tuples = sorted(dict_num_freq.items(), key=lambda item: item[1], reverse = True) #tuple = (number, number_of_times)

    new_dict_num_freq = {}
    for each in new_unique_numbers:
        cnt = numbers_as_per_PL.count(each)
        new_dict_num_freq[each] = cnt

    return new_dict_num_freq, numbers_as_per_PL

Однако, во-первых, я не уверен, является ли этот подход правильным или нет. Во-вторых, используя этот подход, я получаю все уникальные цветные шарики в верхней паре бинов, тогда как я ожидал, что большое количество уникальных цветных шариков будет распределено только в бункерах с очень небольшим количеством шариков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...