Есть ли в Python функция, которая выдает результат, основанный на распределении вероятностей? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть массив чисел, скажем, от 0 до 8, которые могут неоднократно появляться в массиве.Мне нужно выбрать число среди них, и вероятность появления числа должна быть пропорциональна тому, сколько раз оно появляется в этом массиве.

Это исходный массив: ([7, 0, 7, 8, 4, 4, 6, 5, 2, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8])

Это массив, содержащий количество раз, которое каждое число появляется в массиве:
array([ 2., 1., 3., 1., 1., 4., 1., 5., 1.])

Это код, в котором я пытался получить один индекс (градуса), как яописанный ранее

tot = sum((deg))
n = np.random.uniform(0, tot)
for i in range(len(deg)):
    if n < deg[i]:
        return i
    n = n - deg[i]
return i

Я получаю индекс 2, но я не знаю, является ли этот процесс вероятностно правильным.Что ты говоришь?

1 Ответ

2 голосов
/ 26 марта 2019

Вы можете просто использовать random.choice на исходном входе.Вероятность выбора элемента будет автоматически пропорциональна количеству появлений, поскольку выбранный индекс распределен равномерно.Нет необходимости вычислять deg.

. Как указано в комментариях, у вас также есть возможность использовать random.choices, что позволит вам не только собрать несколько образцов с заменой, но позволяет вручную назначать пропорции для каждого элемента.

Например, следующие три входа должны выбрать одинаковые три элемента для данного начального числа:

 x = [1, 2, 3, 2, 7, 7, 7, 7]
 y = [1, 2, 3, 7]
 z = [1, 2, 1, 4]
 w = [0.125, 0.25, 0.125, 0.5]

 random.choices(x, k=3)
 random.choices(y, weights=z, k=3)
 random.choices(y, weights=w, k=3)

Для перехода от x до y и z, используйте collections.Counter:

 c = collections.Counter(x)
 y, z = map(list, zip(*c.items()))
...