Я оцінив зразок ковариационной матриці зразка і отримати симетричну матрицю. З , я хотів би створити -мірного нормальний розподілений гп , але тому мені потрібно розкладання Холецкого . Що робити, якщо не є позитивним?
Я оцінив зразок ковариационной матриці зразка і отримати симетричну матрицю. З , я хотів би створити -мірного нормальний розподілений гп , але тому мені потрібно розкладання Холецкого . Що робити, якщо не є позитивним?
Відповіді:
Заклопотаність питання , як генерувати випадкові з випадкових величин багатовимірного нормального розподілу з (можливо) єдиним числом ковариационной матрицею . Ця відповідь пояснює один із способів роботи будь-якої матриці коваріації. Він забезпечує реалізацію, яка перевіряє його точність.R
Оскільки - матриця коваріації, вона обов'язково є симетричною і позитивно-напівдефінітною. Щоб завершити довідкову інформацію, нехай μ буде вектор бажаних коштів.
Оскільки є симетричним, його сингулярне розкладання величини (SVD) та його eigendecomposition автоматично матимуть вигляд
для деякої ортогональної матриці та діагональної матриці D 2 . Загалом діагональні елементи D 2 невід'ємні (мається на увазі, що всі вони мають реальні квадратні корені: виберіть позитивні для формування діагональної матриці ). Інформація, яку ми маємо про С говорить те, що один або декілька з цих діагональних елементів дорівнюють нулю, але це не вплине на жодну з наступних операцій, а також не завадить обчислити SVD.
Нехай є стандартне багатовимірне нормальний розподіл: кожен компонент має нульове середнє, одиничну дисперсії, і все ковариации рівні нуль: її ковариационная матриця є тотожним я . Тоді випадкова величина має матрицю коваріації
Отже, випадкова величина має багатовимірне нормальний розподіл із середнім ц і ковариационной матрицею С .
Наступний R
код формує коваріаційну матрицю заданих розмірів і рангів, аналізує її за допомогою SVD (або, у коментованому коді, з ейгендекомпозицією), використовує цей аналіз для отримання заданої кількості реалізацій (із середнім вектором 0 ) , а потім порівнює матрицю коваріації цих даних з передбачуваною матрицею коваріації як чисельно, так і графічно. Як показано, він генерує 10 , 000 реалізацій , де розмірність Y є 100 і ранг C становить 50 . Вихід є
rank L2
5.000000e+01 8.846689e-05
Тобто, ранг даних також і ковариационная матриця за оцінками з даних знаходиться в межах відстані 8 × 10 - 5 з C --which близько. Як детальніша перевірка, коефіцієнти будують проти коефіцієнтів його оцінки. Всі вони лежать близько до лінії рівності:
Код точно паралельний попередньому аналізу, і тому він повинен бути пояснювальним (навіть для некористувачів R
, які могли би імітувати його в улюбленому середовищі додатків). Одне, що виявляється, - це необхідність обережності при використанні алгоритмів з плаваючою комою: записи можуть бути негативними (але крихітними) через неточність. Такі записи потрібно знецілити, перш ніж обчислити квадратний корінь, щоб знайти D сам.
n <- 100 # Dimension
rank <- 50
n.values <- 1e4 # Number of random vectors to generate
set.seed(17)
#
# Create an indefinite covariance matrix.
#
r <- min(rank, n)+1
X <- matrix(rnorm(r*n), r)
C <- cov(X)
#
# Analyze C preparatory to generating random values.
# `zapsmall` removes zeros that, due to floating point imprecision, might
# have been rendered as tiny negative values.
#
s <- svd(C)
V <- s$v
D <- sqrt(zapsmall(diag(s$d)))
# s <- eigen(C)
# V <- s$vectors
# D <- sqrt(zapsmall(diag(s$values)))
#
# Generate random values.
#
X <- (V %*% D) %*% matrix(rnorm(n*n.values), n)
#
# Verify their covariance has the desired rank and is close to `C`.
#
s <- svd(Sigma <- cov(t(X)))
(c(rank=sum(zapsmall(s$d) > 0), L2=sqrt(mean(Sigma - C)^2)))
plot(as.vector(C), as.vector(Sigma), col="#00000040",
xlab="Intended Covariances",
ylab="Estimated Covariances")
abline(c(0,1), col="Gray")
Спосіб рішення A :
У MATLAB код був би
D = 0.5 * (C + C');
D = D + (m - min(eig(CD)) * eye(size(D));
Метод рішення B : Сформулюйте та розв’яжіть опуклу СДП (семідефінітну програму), щоб знайти найближчу матрицю D до C відповідно до норми фробеніуса їх різниці, такою, що D є позитивно визначеним, задавши мінімальне власне значення m.
Використовуючи CVX під MATLAB, код буде таким:
n = size(C,1);
cvx_begin
variable D(n,n)
minimize(norm(D-C,'fro'))
D -m *eye(n) == semidefinite(n)
cvx_end
Порівняння методів рішення : Крім симетризації початкової матриці, метод розчину A коригує (збільшує) лише діагональні елементи на деяку загальну кількість і залишає недіагональні елементи незмінними. Метод рішення B знаходить найближчу (до початкової матриці) позитивну певну матрицю, що має вказане мінімальне власне значення, у значенні мінімальної норми фробеніуса різниці позитивної визначеної матриці D та вихідної матриці C, яка заснована на сумах різниці у квадраті всіх елементів D - C, включаючи недіагональні елементи. Таким чином, коригуючи недіагональні елементи, це може зменшити величину, на яку потрібно збільшити діагональні елементи, а діагоальні елементи не обов'язково всі збільшити на однакову кількість.
Я б почав з роздумів про модель, яку ви оцінюєте.
Якщо матриця коваріації не є напіввизначеною позитивною ознакою, це може означати, що у вас є проблема колінеарності у ваших змінних, яка вказувала б на проблему з моделлю і не обов'язково повинна бути вирішена числовими методами.
Якщо матриця з числових причин не є позитивною напівкінцевою, то деякі рішення, про які можна прочитати тут
Одним із способів було б обчислити матрицю з розкладання власного значення. Тепер я визнаю, що я не знаю занадто багато математики, що стоїть за цими процесами, але з моїх досліджень здається, що цей файл довідки здається корисним:
http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html
та деякі інші споріднені команди в Р.
Також перегляньте "NearPD" в пакеті Matrix.
Вибачте, що я не міг би допомогти, але сподіваюся, що мій пошук може допомогти підштовхнути вас у правильному напрямку.
Результати можна отримати за допомогою функції NearPD в пакеті Matrix в Р. Це дозволить повернути реальну матрицю з цінністю.
library(Matrix)
A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0
n.A <- nearPD(A, corr=T, do2eigen=FALSE)
n.A$mat
# 3 x 3 Matrix of class "dpoMatrix"
# [,1] [,2] [,3]
# [1,] 1.0000000 0.7606899 0.1572981
# [2,] 0.7606899 1.0000000 0.7606899
# [3,] 0.1572981 0.7606899 1.0000000