Pozitif-tanımlı olmayan kovaryans matrisi ile normal olarak dağıtılmış rasgele sayılar üretin


15

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 ?CCnCC


1

1
Pozitif semidefinite matrislerinin birden fazla kare kökü vardır ( örneğin , stats.stackexchange.com/a/71303/919 sonundaki açıklamaya bakın ). Cholesky ayrışması tarafından üretilene ihtiyacınız olmayabilir. Burada problemin kalbi yatar: matris tekil olsa bile çalışan kare kökleri hesaplamak için bir yöntem bulun. @amoeba Başlık, yorumunuzun doğru olduğunu gösteriyor.
whuber

Yanıtlar:


8

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 .CR


Kovaryans matrisinin cebirsel analizi

Çü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.Cμ

Çünkü simetriktir, kendi tekil değer ayrışımı (SVD) ve eigendecomposition otomatik olarak form olacaktırC

C=VD2V

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.VD 2 D CD2D2DC

Çok değişkenli rasgele değerler oluşturma

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 XXIY=VDX

Cov(Y)=E(YY)=E(VDXXDV)=VDE(XX)DV=VDIDV=VD2V=C.

Sonuç olarak, rastgele değişken , ortalama ve kovaryans matrisi ile çok değişkenli bir Normal dağılıma sahiptir .μ+YμC

Hesaplama ve Örnek kod

Aşağıdaki Rkod, 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ıY010,000Y100C50

        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:508×105CC

şekil

Kod, önceki analize tam olarak paraleldir ve bu nedenle kendi kendini açıklayıcı olmalıdır ( Rfavori 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 .D2D

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")

2
+1 ama ilk cümlede "belirsiz" dediğinde tam olarak ne demek istiyorsun? Wikipedia'da kontrol ettim ve pozitif semidefinitin belirsiz olmadığını, yani belirsizliğin C'nin hem pozitif hem de negatif özdeğerlere sahip olduğu anlamına gelir. Orada demek istediğin bu mu?
amip diyor Reinstate Monica

2
@amoeba Evet, bu bir kayma idi. Fark ettiğiniz için teşekkürler. "Belirsiz" matris imzasının hem pozitif hem de negatif işaretlere sahip olduğu anlamına gelirken, "semidefinite" imzanın sadece bir işaretine sahip olduğu anlamına gelir.
whuber

6

Çözüm Yöntemi A :

  1. C simetrik değilse simetize edin. D <-0.5(C+CT)
  2. İstenen marj, m, ile pozitif kesin olarak tanımlamak için yeterli olan simetrikleştirilmiş C'ye bir Kimlik matrisi katının eklenmesi, yani yeni matrisin en küçük öz değeri minimum öz = = m olacak şekilde. Özellikle, D <- ; burada I, kimlik matrisidir. D, istenen pozitif tanımlı kovaryans matrisini içerir.D+(mmin(eigenvalue(D)))I

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.


2

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


1
Varsayım, modelin doğrusal karışık bir model olduğu yönündedir. Ve bu durumda veriler için doğru bir model bulmak uygun değildir, daha ziyade veriler bazı hesaplamalara örnek olarak verilmiştir. Şimdi, covaraince için tahmin olarak pozitif olmayan bir semidefinite matrisi elde etme olasılığı var. O zaman ne yapmalıyım, eğer verilerin geldiği normal dağıtılmış popülasyondan kovaryans bulmak istersem. Numunenin normal dağılmış olduğu varsayımdır.
Klaus

1

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.


Merhaba, bağlantılar için teşekkürler. Özde değer ayrışmasına bağlı olarak, bu ayrıştırma yardımcı olmaz, çünkü oradan kare kök matrisi için karmaşık özdeğerler alırsınız, ancak reell değerli matrise ihtiyacım var.
Klaus

1

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

R. kullanıcıları için bu benim cevabımda Çözüm Yöntemi B'nin kötü bir "zavallı adamın" versiyonu (daha az kontrol ile) olmayabilir.
Mark L. Stone

Bunun optimal olmadığını kabul ediyorum ama bazen hile yapıyor.
Dr. Mike

@ Dr.Mike, SE
GENIVI-LEARNER
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.