Выборка из двумерного нормального в питоне - PullRequest
2 голосов
/ 30 декабря 2011

Я пытаюсь создать две случайные переменные, которые связаны друг с другом, и я считаю, что лучший способ - извлечь из двумерного нормального распределения с заданными параметрами (открытыми для других идей). Некоррелированная версия выглядит так:

import numpy as np
sigma = np.random.uniform(.2, .3, 80)
theta = np.random.uniform( 0, .5, 80)

Однако для каждого из 80 розыгрышей я хочу, чтобы значение сигмы было связано со значением тета. Есть мысли?

Ответы [ 2 ]

11 голосов
/ 30 декабря 2011

Используйте встроенный: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html

>>> import numpy as np
>>> mymeans = [13,5]  
>>> # stdevs = sqrt(5),sqrt(2)
>>> # corr = .3 / (sqrt(5)*sqrt(2) = .134
>>> mycov = [[5,.3], [.3,2]]   
>>> np.cov(np.random.multivariate_normal(mymeans,mycov,500000).T)
array([[ 4.99449936,  0.30506976],
       [ 0.30506976,  2.00213264]])
>>> np.corrcoef(np.random.multivariate_normal(mymeans,mycov,500000).T)
array([[ 1.        ,  0.09629313],
       [ 0.09629313,  1.        ]])
  1. Как показано, все становится немного опаснее, если вам приходится приспосабливаться к отклонениям, не связанным с единицей)
  2. подробнее: http://www.riskglossary.com/link/correlation.htm
  3. Чтобы иметь смысл в реальном мире, ковариационная матрица должна быть симметричной и также должна быть положительно определенной или положительной полуопределенной (она должна быть обратимой). Конкретные антикорреляционные структуры могут быть невозможны.
0 голосов
/ 24 февраля 2019

import multivariate_normal из scipy можно использовать.Предположим, мы создаем случайные величины x и y:

from scipy.stats import multivariate_normal

rv_mean = [0, 1]  # mean of x and y  
rv_cov = [[1.0,0.5], [0.5,2.0]]  # covariance matrix of x and y
rv = multivariate_normal.rvs(rv_mean, rv_cov, size=10000)

У вас есть x из rv[:,0] и y из rv[:,1].Коэффициенты корреляции можно получить из

import numpy as np
np.corrcoef(rv.T)
...