Подтвердить что ты не робот

Разница Python между randn и normal

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

нормально

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.

В этом случае вы создаете нормальный дистрибутив SPECIFIC, стандартный дистрибутив.


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

Нормальное распределение - это распределение, где значения более вероятно происходят вблизи среднего значения. В природе существует множество случаев этого. Например, средняя высокая температура в Далласе в июне составляет, скажем, 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.

Ответ 3

Следуя объяснениям @Mike Williamson о дисперсии, стандартном отклонении, я был пойман при попытке отработать пример, приведенный в документации Numpy для randn. Пример, приведенный там:

Create (2x4) Array/Matrix whose distribution has Mean = 3, Variance = 6.25

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

Замечания:

sqrt (дисперсия) = стандартное отклонение или сигма

sqrt (6,25) = 2,5

Следовательно:

sigma * numpy.random.randn(2, 4) + mean