Python-генерирующие числа в соответствии с матрицей корреляции - PullRequest
0 голосов
/ 02 ноября 2018

enter image description hereenter image description here

enter image description here

Привет, я пытаюсь сгенерировать коррелированные данные как можно ближе к первой таблице (первые три строки показаны из 13). Также показана матрица корреляции для соответствующих столбцов (corr_total).

Я пытаюсь следующий код, который показывает ошибку: "LinAlgError: 4-й ведущий минор не определен положительно"

from scipy.linalg import cholesky

# Correlation matrix

# Compute the (upper) Cholesky decomposition matrix

upper_chol = cholesky(corr_total)

# What should be here? The mu and sigma of one row of a table?
rnd = np.random.normal(2.57, 0.78, size=(10,7))


# Finally, compute the inner product of upper_chol and rnd
ans = rnd @ upper_chol

Мой вопрос заключается в том, что входит в значения Mu и sigma и как устранить ошибку, показанную выше. Спасибо! П.С. Я отредактировал вопрос, чтобы показать исходную таблицу. Он показывает данные для четырех пациентов. Я в основном хочу сделать синтетические данные для большего количества случаев, которые повторяют образцы, найденные у этих пациентов

1 Ответ

0 голосов
/ 03 ноября 2018

Спасибо, что ответили на мой вопрос о том, когда у вас есть доступ к данным. Полученная вами ошибка возникла, когда вы позвонили cholesky. cholesky требует, чтобы ваша матрица была положительной полуопределенной. Один из способов проверить, является ли матрица полуположительно определенной, состоит в том, чтобы увидеть, все ли ее собственные значения больше нуля. Одно из собственных значений вашей матрицы корреляции / ковариации почти равно нулю. Я думаю, что Холески просто суетливый. Использование может использовать scipy.linalg.sqrtm в качестве альтернативного разложения.

Для вашего вопроса о генерации многомерных нормалей генерируемая вами случайная нормаль должна быть стандартной случайной нормалью, т. Е. Средним значением 0 и шириной 1. Numpy предоставляет стандартному генератору случайных норм с np.random.randn. Чтобы сгенерировать многомерную нормаль, вы также должны взять декомпозицию ковариации, а не матрицу корреляции. Следующее сгенерирует многомерную нормаль с использованием аффинного преобразования, как в вашем вопросе.

from scipy.linalg import cholesky, sqrtm
relavant_columns = ['Affecting homelife',
           'Affecting mobility',
           'Affecting social life/hobbies',
           'Affecting work',
           'Mood',
           'Pain Score',
           'Range of motion in Doc']

# df is a pandas dataframe containing the data frame from figure 1
mu = df[relavant_columns].mean().values
cov = df[relavant_columns].cov().values
number_of_sample = 10


# generate using affine transformation
#c2 = cholesky(cov).T
c2 = sqrtm(cov).T
s = np.matmul(c2, np.random.randn(c2.shape[0], number_of_sample)) + mu.reshape(-1, 1)

# transpose so each row is a sample
s = s.T 

Numpy также имеет встроенную функцию, которая может генерировать многомерные нормали напрямую

s = np.random.multivariate_normal(mu, cov, size=number_of_sample)
...