numpy.random.Generator.multivariate_normal
метод
- random.Generator.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8, *, method='svd')
-
Генерация случайных выборок из многомерного нормального распределения.
Многомерное нормальное, или гауссово распределение, является обобщением одномерного нормального распределения на случай большей размерности. Такое распределение определяется средним значением и матрицей ковариаций. Эти параметры аналогичны среднему (среднему арифметическому или «центру») и дисперсии (квадрату стандартного отклонения или «ширине») одномерного нормального распределения.
- Параметры:
-
- meanОдномерный массив, длиной N
-
Среднее значение N-мерного распределения.
- covДвумерный массив, формы (N, N)
-
Матрица ковариаций распределения. Она должна быть симметричной и положительно полуопределенной для корректной генерации выборок.
- sizeЦелое число или кортеж целых чисел, необязательно
-
При заданной форме, например,
(m,n,k), генерируютсяm*n*kвыборок, упакованных вm-на-n-на-kразмещение. Так как каждая выборкаN-мерна, форма результата(m,n,k,N). Если форма не указана, возвращается одна (N-мерная) выборка. - check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, необязательно
-
Поведение при не положительной определенности матрицы ковариаций.
- tolЧисло с плавающей точкой, необязательно
-
Порог при проверке сингулярных значений в матрице ковариаций. cov преобразуется в тип double перед проверкой.
- method{ ‘svd’, ‘eigh’, ‘cholesky’}, необязательно
-
Ввод cov используется для вычисления матрицы коэффициентов A такой, что
A @ A.T = cov. Этот аргумент используется для выбора метода вычисления матрицы коэффициентов A. По умолчанию, метод ‘svd’ самый медленный, в то время как ‘cholesky’ самый быстрый, но менее надежный, чем самый медленный метод. Методeighиспользует разложение по собственным значениям для вычисления A и быстрее, чем svd, но медленнее, чем cholesky.Новое в версии 1.18.0.
- Возвращаемое значение:
-
- outndarray
-
Сгенерированные выборки, формы size, если она была указана. Если нет, форма
(N,).Другими словами, каждый элемент
out[i,j,...,:]представляет собой N-мерное значение, сгенерированное из распределения.
Примечания
Среднее значение — это координата в N-мерном пространстве, представляющая местоположение, где выборки наиболее вероятно генерируются. Это аналогично пику кривой Гаусса для одномерного или унивариатного нормального распределения.
Ковариация указывает на уровень совместного изменения двух переменных. Из многомерного нормального распределения мы извлекаем N-мерные выборки, \(X = [x_1, x_2, ... x_N]\). Элемент матрицы ковариаций \(C_{ij}\) представляет собой ковариацию \(x_i\) и \(x_j\). Элемент \(C_{ii}\) — дисперсия \(x_i\) (т.е. её «разброс»).
Вместо указания полной матрицы ковариаций можно использовать популярные приближения:
- Сферическая ковариация (
covявляется кратной единичной матрице) - Диагональная ковариация (
covимеет неотрицательные элементы, только на диагонали)
Это геометрическое свойство можно увидеть на графике, нарисовав точки, сгенерированные из выборки:
>>> mean = [0, 0] >>> cov = [[1, 0], [0, 100]] # diagonal covariance
Диагональная ковариация означает, что точки ориентированы вдоль осей x или y:
>>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng() >>> x, y = rng.multivariate_normal(mean, cov, 5000).T >>> plt.plot(x, y, 'x') >>> plt.axis('equal') >>> plt.show()Обратите внимание, что матрица ковариаций должна быть положительно полуопределённой (также называется неотрицательно определённой). Иначе поведение этого метода не определено, и обратная совместимость не гарантируется.
Эта функция использует процедуры линейной алгебры, поэтому результаты могут отличаться (даже с точки зрения точности) между архитектурами, операционными системами или даже версиями библиотек. Например, это вероятно, если
covимеет несколько одинаковых сингулярных значений иmethodявляется'svd'(по умолчанию). В этом случае,method='cholesky'может быть более надёжным.Ссылки
[1]Papoulis, A., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.
[2]Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: Wiley, 2001.
Примеры
>>> mean = (1, 2) >>> cov = [[1, 0], [0, 1]] >>> rng = np.random.default_rng() >>> x = rng.multivariate_normal(mean, cov, (3, 3)) >>> x.shape (3, 3, 2)
Мы можем использовать другой метод, отличный от стандартного, для факторизации cov:
>>> y = rng.multivariate_normal(mean, cov, (3, 3), method='cholesky') >>> y.shape (3, 3, 2)
Здесь мы генерируем 800 выборок из двумерного нормального распределения со средним [0, 0] и матрицей ковариаций [[6, -3], [-3, 3.5]]. Ожидаемые дисперсии первой и второй компонент выборки составляют 6 и 3,5 соответственно, а ожидаемый коэффициент корреляции равен -3/sqrt(6*3.5) ≈ -0.65465.
>>> cov = np.array([[6, -3], [-3, 3.5]]) >>> pts = rng.multivariate_normal([0, 0], cov, size=800)
Проверим, что среднее значение, ковариация и коэффициент корреляции выборки близки к ожидаемым значениям:
>>> pts.mean(axis=0) array([ 0.0326911 , -0.01280782]) # may vary >>> np.cov(pts.T) array([[ 5.96202397, -2.85602287], [-2.85602287, 3.47613949]]) # may vary >>> np.corrcoef(pts.T)[0, 1] -0.6273591314603949 # may varyМы можем визуализировать эти данные с помощью диаграммы рассеяния. Ориентация облака точек иллюстрирует отрицательную корреляцию компонентов этой выборки.
>>> import matplotlib.pyplot as plt >>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5) >>> plt.axis('equal') >>> plt.grid() >>> plt.show()
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/generated/numpy.random.Generator.multivariate_normal.html