Python: генерировать нормальное распределение в порядке звонка - PullRequest
0 голосов
/ 24 июня 2018

Я хочу генерировать нормальное распределение в порядке звонка.Я использовал этот код для генерации чисел:

import numpy as np

mu,sigma,n = 0.,1.,1000

def normal(x,mu,sigma):
    return ( 2.*np.pi*sigma**2. )**-.5 * np.exp( -.5 * (x-mu)**2. / sigma**2. )

x = np.random.normal(mu,sigma,n) #generate random list of points from normal distribution
y = normal(x,mu,sigma) #evaluate the probability density at each point
x,y = x[np.argsort(y)],np.sort(y) #sort according to the probability density

, который представляет собой код, предложенный в: Генерация нормального распределения в порядке python, numpy

, но цифры не являютсяпосле формы звонка.Есть идеи?Большое спасибо

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Ваш код работает просто отлично.

import numpy as np
import matplotlib.pyplot as plt

mu,sigma,n = 0.,1.,1000

def normal(x,mu,sigma):
    return ( 2.*np.pi*sigma**2. )**-.5 * np.exp( -.5 * (x-mu)**2. / sigma**2. )

x = np.random.normal(mu,sigma,n) 
y = normal(x,mu,sigma) 


plt.plot(x,y)

enter image description here

0 голосов
/ 24 июня 2018

Несколько вещей, которые вы путаете.

random.normal рисует n числа случайным образом из кривой колокола

Таким образом, у вас есть 1000 чисел, каждоеотчетливый, все нарисовано по кривой.Чтобы воссоздать кривую, вам нужно применить некоторое бининг.Количество точек в каждой ячейке воссоздает кривую (сама по себе одна точка вряд ли может представлять вероятность).Использование некоторого расширенного биннинга для вашего x вектора только из 1000 точек:

h,hx=np.histogram(x,bins=50)

и построение графика h как функции hx (поэтому я группирую ваши тысячи чисел в 50 бинов, *На оси 1014 * будет показано количество точек в корзинах: enter image description here

Теперь мы видим, что x было взято из распределения колоколов - шанс упасть в центральную корзинуопределяется по Гауссу. Это выборка, поэтому каждая точка, конечно, может немного отличаться - чем больше точек вы используете и чем точнее биннинг, тем лучше (сглаживание).

y = normal(x,mu,sigma)

Это просто оценивает гауссиану в любой заданный x, поэтому на самом деле, поставьте normal любой список чисел вокруг вашего среднего значения (мю), и он точно вычислит кривую колокола (точная вероятность). Построение вашего y против x (не имеет значения, что ваш x является гауссовским, но это среднее значение на 1000 пунктов, поэтому он может воссоздать функции): enter image description here

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

...