2014-02-12 3 views
17

Я использую функции randn и normal от модуля numpy.random от Python. Функции очень похожи на то, что я читал в руководстве http://docs.scipy.org (оба они касаются распределения Гаусса), но есть ли какие-то более тонкие различия, о которых я должен знать? Если да, то в каких ситуациях мне будет лучше использовать определенную функцию?Python разница между randn и нормальным

+2

Они кажутся мне разными. 'normal': Нарисуйте случайные выборки из нормального (гауссовского) распределения. 'randn': возвращает случайную матрицу с данными из стандартного нормального распределения – hughdbrown

+4

@hughdbrown Такое же распределение, немного другой способ использования. –

ответ

14

randn, похоже, дает распределение из некоторого стандартизованного нормального распределения (среднее значение 0 и дисперсия 1). normal принимает больше параметров для большего контроля. Так rand кажется просто удобной функцией

+3

В конце они называют ту же C-функцию ('rk_gauss'). Я думаю, что 'randn' существует в основном для того, чтобы сделать новообращенных MATLAB счастливыми. MATLAB 'randn' кажется более или менее идентичным. –

+0

Ahh, в каком файле они определены? Я подумал, что это так, и немного посмотрел в источник, но я не смог его найти. – M4rtini

+0

'numpy/random/mtrand/distributions.c' –

38

Я статистик, который иногда кодирует, а не наоборот, поэтому я могу ответить с некоторой точностью.

Глядя на документы, которые вы связаны в вашем вопросе, я выделю некоторые из ключевых отличий:

нормальных:

numpy.random.normal(loc=0.0, scale=1.0, size=None) 
# Draw random samples from a normal (Gaussian) distribution. 

# Parameters : 
# loc : float -- Mean (“centre”) of the distribution. 
# scale : float -- Standard deviation (spread or “width”) of the distribution. 
# size : tuple of ints -- Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn. 

Таким образом, в этом случае, вы генерируя GENERIC нормальное распределение (подробнее об этом позже).

randn:

numpy.random.randn(d0, d1, ..., dn) 
# Return a sample (or samples) from the “standard normal” distribution. 

# Parameters : 
# d0, d1, ..., dn : int, optional -- The dimensions of the returned array, should be all positive. If no argument is given a single Python float is returned. 
# Returns : 
# Z : ndarray or float -- A (d0, d1, ..., dn)-shaped array of floating-point samples from the standard normal distribution, or a single such float if no parameters were supplied. 

В этом случае, вы генерируя КОНКРЕТНОГО нормальное распределение, стандартное распределение.


Теперь некоторые из математики, что действительно необходимо, чтобы получить в центре Вашего вопроса:

Нормальное распределение является распределением, где значения более вероятно происходить вблизи среднего значения , В природе существует множество случаев этого. Например, средняя высокая температура в Далласе в июне составляет, скажем, 95 F. Это может достигать 100 или даже 105 средних за один год, но, как правило, оно будет около 95 или 97. Точно так же оно может достигать 80, но более вероятно 85 или 90.

Таким образом, это принципиально отличается от, скажем, равномерного распределения (свертывание честной 6-сторонней матрицы).


стандартное нормальное распределение просто нормальное распределение, где среднее значение равно 0, а дисперсия (математический термин для вариации) равен 1.

Так,

numpy.random.normal(size= (10, 10)) 

это точно такая же вещь, как написание

numpy.random.randn(10, 10) 

, поскольку значения по умолчанию (loc = 0, scale = 1) для numpy.random.normal являются фактически стандартом .

Чтобы сделать дела более запутанной, как numpy random documentation состояний:

sigma * np.random.randn(...) + mu 

такая же, как

np.random.normal(loc= mu, scale= sigma, ...) 

* Конечная нота: Я использовал термин дисперсия математически описать изменение. Некоторые люди говорят о стандартном отклонении. Разница просто равна квадрату стандартного отклонения. Поскольку дисперсия = 1 для стандартного распределения, в данном случае стандартного распределения, variance == standard deviation.

+0

Ваш ответ кажется интересным. Но как можно генерировать шум, если, например, измерение скорости? Шум должен содержать только положительные значения.?! Если это так, нормальное распределение не может генерировать положительное значение, верно? – Spider

+1

Я не уверен, что буду следовать, @Spider. Если я буду следовать за вами, вы спрашиваете, как значения могут быть ниже среднего. Определение стандартного отклонения - это вариация ВОКРУГ среднего. То есть, выше и ниже. Недостаточно места здесь, чтобы войти в него, но посмотрите http://en.wikipedia.org/wiki/Standard_deviation или http://en.wikipedia.org/wiki/Normal_distribution –

+0

О, теперь я получаю то, что вы говорили: да, «скорость» (а не скорость, которая является вектором) должна иметь только положительные числа. И да, нормальное распределение допускает отрицательные числа. Поэтому, как уже говорит ваша интуиция, скорость не соответствует нормальному распределению. Существует множество других типов распределений, таких как Poisson или Binomial. –

Смежные вопросы