Range (), но с нормальным распределением? (без случайности) - PullRequest
1 голос
/ 17 апреля 2020

Ищите функцию python, которая эмулирует range (), но для нормального распределения, а не для установленного интервала.

Так что вместо range(min, max, interval) я хочу что-то вроде mynormrange(min, max, numberofpoints). Опция обратного распределения тоже была бы великолепна.

Так что mynormrange(0, 100, 9) будет выводить что-то вроде [0, 34, 47.5, 49.85, 50, 50.15, 52.5, 66, 100], где числа вокруг среднего (в данном случае avg = 50) ближе друг к другу.

И обратное mynormrange(0, 100, 9, inverse=True) будет выводить что-то вроде [0, 0.15, 2.5, 16, 50, 84, 97.5, 99.85, 100], где числа по краям (в данном случае 0 и 100) ближе друг к другу.

Хотя я не хочу случайности, настолько случайной. normal () не работает для того, что мне нужно.

Что-то вроде linspace () numpy, но для нормального распределения.

Редактировать: я просто собираюсь объединить пробел и косинус, умноженные на желаемое максимальное значение. Синус для обратного.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Полагаю, вы могли бы использовать что-то вроде np.random.normal().

Это позволяет генерировать массив любой формы, какой вы захотите.

  • Первый аргумент loc является центром вашего стандартного распределения, 50 в вашем примере выше.

  • Второй аргумент scale - это стандартное отклонение (распространение или «ширина») распределения.

  • Последний аргумент size - это просто выходная форма, которая может быть число или кортеж целых чисел

Затем мы будем использовать этот массив для выборки из распределения и np.clip выходов до минимума. максимальное значение (как мы могли бы получить экстремальные значения в зависимости от размера нашего массива). Наконец, мы сортируем вывод до np.sort

def mynormrange(min, max, stddev, numberofpoints):
    # (min+max)//2 yields the centre point of our distribution 
    distribution = np.random.normal(loc=(min+max)//2, 
                                    scale=stddev,
                                    size=numberofpoints)
    return np.sort(np.clip(distribution, min, max), axis=None)

>>> mynormrange(min=0, max=100, stddev=28, numberofpoints=20)
array([ 0.        , 11.84519127, 16.3296094 , 24.55199703, 25.30222761,
       30.46270933, 30.52531999, 34.18142498, 42.30422449, 44.8864856 ,
       48.54756954, 56.00797349, 58.51853892, 58.65086592, 61.0481076 ,
       68.87172721, 77.65995267, 85.73321417, 86.2329193 , 86.31444371])

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

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

0 голосов
/ 17 апреля 2020

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

Однако это не может быть функция, подобная range, поскольку она генерирует случайные результаты (с указанным распределением). Обратите внимание, что вы можете указать среднее значение для диапазона [a,b], (a+b)/2, но вам нужно указать дисперсию для распределения (если вы не определяете ее на основе заданного диапазона).

Остерегайтесь того, что ваш утверждение о «я не хочу случайности, хотя» здесь не может быть значимым! Потому что вы говорите о распределении!

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