Bir numunenin örnek kovaryans matrisi tahmin ettim ve simetrik bir matris elde ettim . İle , ben oluşturmak istiyorum -variate Normal dağıtılan rn ama bu nedenle ben Choleskey ayrışmasını ihtiyaç C . C pozitif tanımlı değilse ne yapmalıyım ?
Bir numunenin örnek kovaryans matrisi tahmin ettim ve simetrik bir matris elde ettim . İle , ben oluşturmak istiyorum -variate Normal dağıtılan rn ama bu nedenle ben Choleskey ayrışmasını ihtiyaç C . C pozitif tanımlı değilse ne yapmalıyım ?
Yanıtlar:
Soru, (muhtemelen) tekil kovaryans matrisi ile çok değişkenli bir Normal dağılımdan rastgele değişkenlerin nasıl üretileceği ile ilgilidir . Bu cevap, herhangi bir kovaryans matrisi için işe yarayacak bir yolu açıklar . Doğruluğunu test eden bir uygulama sağlar .R
Çünkü , bir kovaryans matrisidir, mutlaka simetrik ve pozitif yarı kesin olduğunu. Arka plan bilgileri tamamlamak için, izin arzu edilen aracının bir vektör.
Çünkü simetriktir, kendi tekil değer ayrışımı (SVD) ve eigendecomposition otomatik olarak form olacaktır
bazı dikey matris ve köşegen matris . Genel olarak köşegen öğeleri negatif değildir (hepsinin gerçek kare kökleri olduğunu ima eder: köşegen matrisi oluşturmak için pozitif olanları seçin ). hakkında sahip olduğumuz bilgiler , bu diyagonal elemanlardan bir veya daha fazlasının sıfır olduğunu ancak bunun sonraki işlemlerden hiçbirini etkilemeyeceğini veya SVD'nin hesaplanmasını engellemeyeceğini söylüyor.D 2 D C
standart bir çok değişkenli Normal dağılımına sahip olmasına izin verin : her bileşenin sıfır ortalaması, birim varyansı vardır ve tüm kovaryanslar sıfırdır: kovaryans matrisi kimliğidir . Sonra rastgele değişken kovaryans matrisine sahiptirI Y = V D X
Sonuç olarak, rastgele değişken , ortalama ve kovaryans matrisi ile çok değişkenli bir Normal dağılıma sahiptir .
Aşağıdaki R
kod, belirli boyutlarda ve sıralarda bir kovaryans matrisi oluşturur, SVD ile analiz eder (veya yorumlanmış kodda, bir öz dizilim ile), bu analizi belirtilen sayıda gerçekleşmesini (ortalama vektör ) oluşturmak için kullanır ve daha sonra bu verilerin kovaryans matrisini, hem sayısal hem de grafiksel olarak amaçlanan kovaryans matrisi ile karşılaştırır. Gösterildiği gibi, bu oluşturur boyutu burada gerçekleşmelerine olan ve seviye olan . Çıktı
rank L2
5.000000e+01 8.846689e-05
Yani, verilerin sıralaması da ve verilerden tahmin edildiği gibi kovaryans matrisi , yakındır. Daha ayrıntılı bir kontrol olarak katsayıları , tahminlerine göre çizilir. Hepsi eşitlik çizgisine yakın:
Kod, önceki analize tam olarak paraleldir ve bu nedenle kendi kendini açıklayıcı olmalıdır ( R
favori uygulama ortamlarında taklit edebilen kullanıcı olmayanlar için bile ). Gösterdiği bir şey, kayan nokta algoritmaları kullanırken dikkat edilmesi gerektiğidir: girişleri, belirsizlik nedeniyle kolayca negatif (ancak küçük) olabilir. i bulmak için karekök hesaplanmadan önce bu tür girişlerin sıfırlanması gerekir .
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")
Çözüm Yöntemi A :
MATLAB'da kod
D = 0.5 * (C + C');
D = D + (m - min(eig(CD)) * eye(size(D));
Çözüm Yöntemi B : Farklarının frobenius normuna göre en yakın D ila C matrisini bulmak için bir Dışbükey SDP (Semidefinite Programı) formüle edin ve çözün, böylece D minimum özdeğer m'yi belirterek pozitif tanımlayıcıdır.
MATLAB altında CVX kullanıldığında kod şöyle olacaktır:
n = size(C,1);
cvx_begin
variable D(n,n)
minimize(norm(D-C,'fro'))
D -m *eye(n) == semidefinite(n)
cvx_end
Çözelti Yöntemlerinin Karşılaştırılması : İlk matrisin simetrikleştirilmesinin yanı sıra, çözelti yöntemi A sadece diyagonal elemanları bir miktar ortak ayar yapar (arttırır) ve diyagonal olmayan elemanları değişmeden bırakır. Çözüm yöntemi B, pozitif tanımlanmış matris D ile orijinal matris C arasındaki farkın minimum frobenius normu anlamında, belirtilen minimum özdeğeri olan en yakın (orijinal matrise) pozitif tanımlanmış matrisi bulur. diyagonal olmayan elemanları dahil etmek için D - C'nin tüm elemanlarının kare farklılıkları. Bu nedenle, diyagonal olmayan öğeleri ayarlayarak, diyagonal elemanların arttırılması gereken miktarı azaltabilir ve diagoanl elemanlarının hepsi aynı miktarda artırılmayabilir.
Tahmin ettiğin modeli düşünerek başlardım.
Kovaryans matrisi pozitif yarı tanımlı değilse, değişkenlerinizde modelle ilgili bir sorunu belirten ve sayısal yöntemlerle çözülmesi gerekmeyen bir doğrusal doğrusallık probleminiz olduğunu gösterebilir.
Matris sayısal nedenlerden dolayı pozitif semidefinite değilse, burada okunabilecek bazı çözümler var
Bunun bir yolu, matrisi bir özdeğer ayrışmasından hesaplamak olacaktır. Şimdi bu süreçlerin ardındaki Math'ı çok fazla bilmediğimi itiraf edeceğim, ancak araştırmamdan bu yardım dosyasına bakmak verimli görünüyor:
http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html
ve R ile ilgili diğer bazı komutlar.
Ayrıca, Matrix paketindeki 'nearPD'ye bakın.
Maalesef daha fazla yardımcı olamadım ama umarım etrafımda aramam doğru yönde ilerlemenize yardımcı olabilir.
Sonuçları R'deki Matrix paketindeki nearPD işlevinden alabilirsiniz. Bu size gerçek değerli bir matris geri verecektir.
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