из набора x элементов, повторяйте каждый элемент y раз так, чтобы y следовал нормальному распределению - PullRequest
0 голосов
/ 04 февраля 2019

Из набора x уникальных предметов мне нужно повторять каждый элемент y раз так, чтобы y следовал нормальному распределению.

Например, если количество элементов n = 5, а y_max = 50. Еслимы подсчитываем, сколько раз каждый элемент в моем отсортированном списке повторяется, изображение будет выглядеть так:

enter image description here

my_set=('a','b','c','d','e')
distribution = np.random.normal(len(my_set)/2, 1,len(my_set)).round().astype(int)
np.repeat(my_set, distribution)

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

Для удобства чтения я буду использовать кортежи вместо того, чтобы повторять каждый элемент y раз.

Ожидаемый результатдолжно быть что-то вроде:

[('a', 2), ('b', 4), ('c', 5), ('d', 3), ('e', 1)]

Фактический результат:

[('a', 5), ('b', 4), ('c', 3), ('d', 4), ('e', 3)]

1 Ответ

0 голосов
/ 04 февраля 2019

Во-первых, давайте сгенерируем желаемый результат.

my_set = ('a', 'b', 'c', 'd', 'e')
distribution = np.random.normal(len(my_set)/2, 1, 10000).round().astype(int)
result = [my_set[max(min(el, 4), 0)] for el in distribution]
np.unique(result, return_counts=True)
>>> (array(['a', 'b', 'c', 'd', 'e'], dtype='<U1'),
>>> array([ 234, 1377, 3421, 3374, 1594]))

Здесь мы генерируем 10000 случайных значений из данного распределения и принимаем соответствующую букву вместо каждого числа.Таким образом, значения представляют именно то, что мы ищем: количество появлений каждой буквы обычно распределено.

Основная проблема в вашем коде заключается в понимании того, что такое распределение или какое значение обычно распространяется.Когда мы вызываем np.random.normal, он просто генерирует переменную, которая обычно распределяется.По определению нормального распределения это означает, что определенное число x появляется с определенной вероятностью p = pdf normal.С точки зрения частот это означает, что если мы будем многократно запускать генерацию переменной, то доля p от общего числа испытаний будет x.И это как раз то, что мы ищем.

В вашем коде вы делаете такую ​​переменную, что сами числа случаев обычно распределяются.Это означает, что каждая буква будет появляться n +- s раз, когда s обычно распространяется.Так что это в основном нормальное распределение с нормальной ошибкой.Внимательно читая ваш пост, я не думаю, что это то, что вы ищете.

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