Korelasi aneh dalam hasil SVD dari data acak; apakah mereka memiliki penjelasan matematis atau apakah itu bug LAPACK?


21

Saya mengamati perilaku yang sangat aneh dalam hasil SVD dari data acak, yang dapat saya tiru di Matlab dan R. Sepertinya beberapa masalah numerik di perpustakaan LAPACK; Apakah itu?

Saya menarik n=1000 sampel dari k=2 dimensi Gaussian dengan nol mean dan kovarian identitas: XN(0,I) . Aku mengumpulkan mereka di 1000×2 matriks data X . (Saya dapat opsional pusat X atau tidak, itu tidak mempengaruhi berikut.) Lalu aku melakukan dekomposisi nilai singular (SVD) untuk mendapatkan X=USV . Mari kita ambil dua elemen tertentu dari U , misalnya U11 dan U22 , dan tanyakan apa korelasi di antara mereka di berbagai imbang berbedaX. Saya akan berharap bahwa jika jumlahNrehal dari menarik cukup besar, maka semua korelasi tersebut akan menjadi sekitar nol (yaitu korelasi populasi harus nol, dan korelasi sampel akan menjadi kecil).

Namun, saya mengamati beberapa korelasi aneh yang kuat (sekitar ±0,2 ) antara U11 , U12 , U21 , dan U22 , dan hanya di antara elemen-elemen ini. Semua pasangan elemen lainnya memiliki korelasi sekitar nol, seperti yang diharapkan. Berikut adalah bagaimana matriks korelasi untuk 20 elemen "atas" dari U terlihat ( 10 elemen pertama dari kolom pertama, kemudian 10 elemen pertama dari kolom kedua):

Korelasi aneh SVD

Perhatikan nilai aneh tinggi di sudut kiri atas setiap kuadran.

Itu komentar ini @ whuber ini yang membawa efek ini ke perhatian saya. @whuber berpendapat bahwa PC1 dan PC2 tidak independen dan disajikan korelasi kuat ini sebagai bukti untuk itu. Namun, kesan saya adalah dia tidak sengaja menemukan bug numerik di perpustakaan LAPACK. Apa yang terjadi disini?

Berikut adalah kode R @ whuber:

stat <- function(x) {u <- svd(x)$u; c(u[1,1], u[2, 2])};
Sigma <- matrix(c(1,0,0,1), 2);
sim <- t(replicate(1e3, stat(MASS::mvrnorm(10, c(0,0), Sigma))));
cor.test(sim[,1], sim[,2]);

Ini kode Matlab saya:

clear all
rng(7)

n = 1000;     %// Number of variables
k = 2;        %// Number of observations
Nrep = 1000;  %// Number of iterations (draws)

for rep = 1:Nrep
    X = randn(n,k);
    %// X = bsxfun(@minus, X, mean(X));
    [U,S,V] = svd(X,0);

    t(rep,:) = [U(1:10,1)' U(1:10,2)'];
end

figure
imagesc(corr(t), [-.5 .5])
axis square
hold on
plot(xlim, [10.5 10.5], 'k')
plot([10.5 10.5], ylim, 'k')

Jika Anda menggunakan n = 4 dan k = 3, Anda akan melihat korelasinya juga.
Aksakal

@Aksakal: ya, memang, terima kasih. Saya diedit untuk menghapus perbedaan yang diklaim antara k = 2 dan k = 3.
Amuba mengatakan Reinstate Monica

Jawaban:


23

Ini bukan bug.

Seperti yang telah kami jelajahi (ekstensif) dalam komentar, ada dua hal yang terjadi. Yang pertama adalah bahwa kolom U dibatasi untuk memenuhi persyaratan SVD: masing-masing harus memiliki panjang unit dan ortogonal untuk yang lainnya. Melihat U sebagai variabel acak yang dibuat dari matriks X acak melalui algoritma SVD tertentu, dengan demikian kami mencatat bahwa k ini (k(k+1)/2 kendala independen fungsional ini menciptakan dependensi statistik di antara kolomU .

Ketergantungan ini mungkin terungkap sampai tingkat yang lebih besar atau lebih kecil dengan mempelajari korelasi antara komponen U , tetapi fenomena kedua muncul : solusi SVD tidak unik. Minimal, setiap kolom U dapat dinegasikan secara independen, memberikan setidaknya 2k solusi berbeda dengan k kolom. Korelasi yang kuat (melebihi 1/2 ) dapat diinduksi dengan mengubah tanda-tanda kolom tepat. (Salah satu cara untuk melakukan ini diberikan dalam komentar pertama saya untuk jawaban Amoeba di utas ini: Saya memaksa semua uii,i=1,,k untuk memiliki tanda yang sama, membuat semuanya negatif atau semuanya positif dengan probabilitas yang sama.) Di lain pihak, semua korelasi dapat dibuat menghilang dengan memilih tanda-tanda secara acak, mandiri, dengan probabilitas yang sama. (Saya memberikan contoh di bawah ini di bagian "Edit".)

Dengan hati-hati, kita dapat sebagian membedakan kedua fenomena ini ketika membaca matriks sebar komponen U . Karakteristik tertentu - seperti penampakan titik-titik yang terdistribusi secara seragam di wilayah melingkar yang terdefinisi dengan baik - meyakini kurangnya kemandirian. Lainnya, seperti scatterplots yang menunjukkan korelasi bukan nol yang jelas, jelas tergantung pada pilihan yang dibuat dalam algoritma - tetapi pilihan tersebut hanya mungkin karena kurangnya independensi di tempat pertama.

Tes akhir dari algoritma penguraian seperti SVD (atau Cholesky, LR, LU, dll) adalah apakah ia melakukan apa yang diklaimnya. Dalam keadaan ini cukup untuk memeriksa bahwa ketika SVD mengembalikan tiga matriks (U,D,V) , bahwa X dipulihkan, hingga kesalahan floating point yang diantisipasi, oleh produk UDV ; bahwa kolom U dan V adalah ortonormal; dan bahwa D adalah diagonal, elemen-elemen diagonalnya adalah non-negatif, dan disusun dalam urutan menurun. Saya telah menerapkan tes tersebut ke svdalgoritma di Windows 7Rdan tidak pernah menemukan kesalahan. Meskipun itu bukan jaminan, itu sepenuhnya benar, pengalaman seperti itu - yang saya percaya dibagikan oleh banyak orang - menunjukkan bahwa bug apa pun akan membutuhkan beberapa jenis input yang luar biasa agar dapat terwujud.

Berikut ini adalah analisis yang lebih rinci tentang poin-poin spesifik yang diangkat dalam pertanyaan.


Menggunakan R's svdprosedur, pertama Anda dapat memeriksa bahwa sebagai k meningkat, korelasi antara koefisien U tumbuh lebih lemah, namun mereka masih nol. Jika Anda hanya melakukan simulasi yang lebih besar, Anda akan menemukan mereka signifikan. (Ketika k=3 , 50000 iterasi harus mencukupi.) Bertentangan dengan pernyataan dalam pertanyaan, korelasi tidak "menghilang sepenuhnya."

Kedua, cara yang lebih baik untuk mempelajari fenomena ini adalah dengan kembali ke pertanyaan mendasar tentang independensi koefisien. Meskipun korelasi cenderung mendekati nol dalam banyak kasus, kurangnya independensi jelas terlihat. Ini dibuat paling jelas dengan mempelajari distribusi multivariat penuh koefisien U . Sifat distribusi muncul bahkan dalam simulasi kecil di mana korelasi nol tidak dapat (belum) terdeteksi. Misalnya, periksa matriks sebaran koefisien. Untuk membuat ini bisa dilakukan, saya mengatur ukuran setiap dataset yang disimulasikan menjadi 4 dan tetap k=2 , sehingga menggambar 1000realisasi dari matriks 4×2U , menciptakan matriks 1000×8 . Berikut ini adalah matriks sebar penuhnya, dengan variabel-variabel yang dicantumkan berdasarkan posisi mereka di dalam U :

Angka

Memindai bawah kolom pertama mengungkapkan kurangnya menarik kemerdekaan antara u11 dan lainnya uij : lihat bagaimana kuadran atas dari sebar dengan u21 hampir kosong, misalnya; atau periksa awan miring ke atas yang menggambarkan hubungan (u11,u22) dan awan miring ke bawah untuk (u21,u12) . Pandangan yang dekat menunjukkan kurangnya kemandirian di antara hampir semua koefisien ini: sangat sedikit dari mereka yang terlihat independen, walaupun kebanyakan dari mereka menunjukkan korelasi yang hampir nol.

(NB: Sebagian besar awan melingkar adalah proyeksi dari hypersphere yang diciptakan oleh kondisi normalisasi yang memaksa jumlah kuadrat dari semua komponen dari setiap kolom menjadi satu.)

Matriks scatterplot dengan k=3 dan k=4 menunjukkan pola yang sama: fenomena ini tidak terbatas padak=2 , juga tidak bergantung pada ukuran setiap set data yang disimulasikan: mereka semakin sulit untuk dihasilkan dan diperiksa.

Penjelasan untuk pola-pola ini mengacu pada algoritma yang digunakan untuk mendapatkan U dalam dekomposisi nilai singular, tetapi kita tahu pola non-independensi tersebut harus ada oleh sifat-sifat yang sangat menentukan dari U : karena setiap kolom berturut-turut adalah (secara geometris) ortogonal dengan pendahulunya yang, kondisi ortogonalitas ini memaksakan dependensi fungsional di antara koefisien, yang dengan demikian menerjemahkan dependensi statistik di antara variabel acak yang sesuai.


Edit

Menanggapi komentar, mungkin perlu berkomentar sejauh mana fenomena ketergantungan ini mencerminkan algoritma yang mendasari (untuk menghitung SVD) dan seberapa banyak mereka melekat dalam sifat proses.

The spesifik pola korelasi antara koefisien tergantung banyak pada pilihan sewenang-wenang yang dilakukan oleh algoritma SVD, karena solusinya adalah tidak unik: kolom U dapat selalu independen dikalikan dengan 1 atau 1 . Tidak ada cara intrinsik untuk memilih tanda. Jadi, ketika dua algoritma SVD membuat pilihan tanda yang berbeda (sewenang-wenang atau bahkan mungkin acak), mereka dapat menghasilkan pola pola sebar yang berbeda dari nilai (uij,uij) . Jika Anda ingin melihat ini, ganti statfungsi dalam kode di bawah ini dengan

stat <- function(x) {
  i <- sample.int(dim(x)[1]) # Make a random permutation of the rows of x
  u <- svd(x[i, ])$u         # Perform SVD
  as.vector(u[order(i), ])   # Unpermute the rows of u
}

Ini pertama secara acak memesan kembali pengamatan x, melakukan SVD, kemudian menerapkan urutan terbalik uagar sesuai dengan urutan pengamatan asli. Karena efeknya adalah untuk membentuk campuran versi yang dipantulkan dan diputar dari scatterplots asli, scatterplots dalam matriks akan terlihat jauh lebih seragam. Semua korelasi sampel akan sangat mendekati nol (dengan konstruksi: korelasi yang mendasarinya persis nol). Namun demikian, kurangnya independensi masih akan jelas (dalam bentuk lingkaran seragam yang muncul, khususnya antara ui,j dan ui,j ).

Kurangnya data di beberapa kuadran dari beberapa plot sebar asli (ditunjukkan pada gambar di atas) muncul dari bagaimana Ralgoritma SVD memilih tanda untuk kolom.

Tidak ada yang berubah tentang kesimpulan. Karena kolom kedua dari U adalah ortogonal dengan yang pertama, maka (dianggap sebagai variabel acak multivariat) bergantung pada yang pertama (juga dianggap sebagai variabel acak multivariat). Anda tidak dapat membuat semua komponen dari satu kolom tidak tergantung pada semua komponen yang lain; yang dapat Anda lakukan adalah melihat data dengan cara yang mengaburkan dependensi - tetapi ketergantungan akan tetap ada.


Berikut adalah Rkode yang diperbarui untuk menangani kasing k>2 dan menggambar sebagian dari matriks sebar.

k <- 2    # Number of variables
p <- 4    # Number of observations
n <- 1e3  # Number of iterations
stat <- function(x) as.vector(svd(x)$u)
Sigma <- diag(1, k, k); Mu <- rep(0, k)
set.seed(17)
sim <- t(replicate(n, stat(MASS::mvrnorm(p, Mu, Sigma))))
colnames(sim) <- as.vector(outer(1:p, 1:k, function(i,j) paste0(i,",",j)))
pairs(sim[, 1:min(11, p*k)], pch=".")

3
Korelasi terjadi antara komponen pertama dari kolom karena itulah cara kerja algoritma SVD. Bahwa baris X adalah Gaussian adalah tidak penting: Saya yakin Anda telah memperhatikan bahwa koefisien U yang tidak Gaussian. UXU
whuber

2
Ngomong-ngomong, saya baru saja menemukan bahwa hanya svd(X,0)dengan mengganti svds(X)kode Matlab saya membuat efeknya hilang! Sejauh yang saya tahu, kedua fungsi ini menggunakan algoritma SVD yang berbeda (keduanya adalah rutinitas LAPACK, tetapi yang tampaknya berbeda). Saya tidak tahu apakah R memiliki fungsi yang mirip dengan Matlab svds, tetapi saya bertanya-tanya apakah Anda masih akan mempertahankan bahwa itu adalah efek "nyata" dan bukan masalah numerik.
Amoeba berkata Reinstate Monica

4
Tuan-tuan, tunggu sebentar. Mengapa kamu tidak berbicara tentang tanda itu? Tanda vektor eigen pada dasarnya arbitrer. Tetapi program svd tidak menetapkannya secara acak, tandanya tergantung pada implementasi svd dan data. Jika, setelah mengekstraksi UAnda memutuskan secara acak apakah masing-masing kolomnya akan tetap seperti apa adanya atau akan mengubah tandanya, bukankah kemudian korelasi yang Anda bicarakan menghilang?
ttnphns

2
@ttnphns Itu benar, seperti yang dijelaskan dalam edit saya. Meskipun itu membuat korelasi menghilang, dependensi di antara kolom tidak hilang begitu saja. (Versi yang disempurnakan dari I yang disediakan setara dengan mengubah tanda-tanda kolom secara acak.)Ustat
whuber

2
Poin minor (untuk utas hebat ini!) SVD tidak mengharuskan elemen-elemen dalam diagonal Sberada dalam urutan tertentu; ini masalah kenyamanan. Rutinitas lain menjamin ini (mis. MATLAB svds) tetapi itu bukan persyaratan umum. @amoeba: Melihat svds(yang tampaknya bebas dari perilaku bermasalah ini) perhitungan didasarkan pada benar-benar menghitung nilai eigen pertama (sehingga tidak menggunakan rutin standar dgesdd/ dgesvdLAPACK - Saya sangat curiga menggunakan dsyevr/ dsyevxpada awalnya).
usεr11852 mengatakan Reinstate Monic

11

Jawaban ini menyajikan replikasi hasil @ whuber di Matlab, dan juga demonstrasi langsung bahwa korelasi adalah "artefak" bagaimana implementasi SVD memilih tanda untuk komponen.

Mengingat rantai panjang komentar yang berpotensi membingungkan, saya ingin menekankan untuk pembaca masa depan yang saya setujui sepenuhnya dengan yang berikut:

  1. U
  2. U1Ui1Uj1ijNrep
  3. UUi1Uj2

0.2Nrep=1000

n=4k=2Nrep=1000

SVD

Di sebelah kiri adalah matriks korelasi, di sebelah kanan - sebar plot mirip dengan @ whuber's. Kesepakatan antara simulasi kami tampaknya sempurna.

U

[U,S,V] = svd(X,0);

Saya menambahkan dua baris berikut:

U(:,1) = U(:,1) * sign(randn(1));
U(:,2) = U(:,2) * sign(randn(1));

Inilah hasilnya:

SVD with random signs

Semua korelasi menghilang, persis seperti yang saya harapkan dari awal !

11

UU

PS. Selamat kepada @whuber karena telah melampaui reputasi 100rb hari ini!


Jika Anda ingin melihat "tinggi" korelasi, menggunakan versi ini SVD di tempat statdalam kode saya: stat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }. Itu memilih tanda-tanda kolomU sedemikian rupa untuk menciptakan korelasi besar di antara (kamu11,kamu22,...,kamukk), dan dengan demikian memberikan demonstrasi lebih lanjut tentang mengapa Anda mungkin ingin memisahkan konsep korelasi (komponenU) dari kemerdekaan (dari kolomU). Kehadiran korelasi besar ini tidak menyiratkan ada bug di SVD!
Whuber

Saya baru saja selesai mengedit jawaban ini, @whuber; Saya digantikan svdsolehsvd diikuti oleh pilihan tanda acak untuk kolomU. Saya setuju dengan Anda: korelasi tinggi sepenuhnya karena pilihan tanda, seperti yang dihipotesiskan oleh ttnphns. Ini memberikan jawaban yang memuaskan untuk pertanyaan saya. Sekarang, mari kita coba selesaikan perselisihan ini! Saya setuju bahwa elemenUadalah variabel acak dan tidak independen. Apakah Anda setuju bahwa angka dalam jawaban Anda sangat menyesatkan dan bahwa menggunakan korelasi 0,2 sebagai argumen dalam debat kami sebelumnya salah?
Amoeba berkata Reinstate Monica

Saya tidak akan setuju dengan itu: angka secara akurat menunjukkan hasil pengaturan default SVD di R. Saya memberikan penjelasan untuk perilaku yang didasarkan pada algoritma dan teori yang mendasarinya. Jika ada aspek yang "menyesatkan", tentu saja saya akan berusaha untuk memperbaiki atau mengklarifikasi masalah, tetapi pada titik ini saya tidak mengetahui adanya masalah khusus untuk diperbaiki. Anda mungkin tertarik untuk mencatat bahwa versi modifikasi yang disediakan dalam komentar saya sebelumnya untuk pertanyaan ini mampu menghasilkan korelasi di sekitar±2/3, memang cukup tinggi: tidak ada yang spesial dari Anda 0,2.
whuber

1
@ttnphns: titik utama whuber adalah elemen Utidak mandiri. Elemen di dalam satu kolom tidak independen karena kuadratnya harus berjumlah satu. Elemen kolom yang berbeda tidak independen, karena kolom harus memiliki produk titik nol. Jadi, jika Anda tahu semua elemen kolom pertama terpisah dari yang terakhir, Anda dapat menghitungnya; jika Anda mengetahui lebih lanjut semua elemen kolom kedua selain dari dua yang terakhir, Anda dapat menghitungnya. Ini berarti, menurut definisi, bahwa mereka tidak independen.
amoeba says Reinstate Monica

1
Intuitively, that's fair. As soon as the first principal axis is defined in space the rest pr. axes get reduced freedom. In case of 2D data the second (last) PC is tied entirely, except the sign. I'd rather call it constraint, not dependence in statistical sense.
ttnphns

0

Check the norm of your singular vectors U and V, it's 1 by definition. You don't need to go through SVD to get the same exact matrix you plot by simply generating two random variables x and y with the constraint that the sum of their squares is 1:

x2+y2=1

Assume that the means are zero, then

Cov[x,y]=Var[xy]=E[x2y2]E[xy]2

This will not be equal to zero. You can plug the standard normal into x and y to see what's the value of covariance to be expected here.


Although this observation is pertinent, it addresses only interdependencies among the individual components of each column (and as such is included within the k(k+1)/2 independent constraints on U). The question that got all this started concerned dependencies between different columns of U: that's why so little attention has been paid to correlations within each column. Another (perhaps fruitful) way to look at this is to roll D into U and analyze the columns of UD, which are no longer normalized, but are still subject to k(k1)/2 constraints.
whuber

It's the columns of U that have length 1, not the rows (in case when U is not square, but has n rows and k columns with n>k). The columns of U have n elements, and we have been discussing two particular cases in this thread: in my question I suggested to consider n=1000, and in his answer @whuber chose to consider n=4. Your example with x2+y2=1 includes only two random variables, so it does not fit to the rest of the discussion here. If you could make a statement about what should be the correlation between two elements of one column of U, that would be interesting.
amoeba says Reinstate Monica

@Amoeba We can make Asksakal's example pertinent either by taking x to be the first component of a column of U and y to be the norm of the remaining components or by extending the example inductively to more variables. Unfortunately, the conclusion is incorrect: it is perfectly possible for x2+y2=1, each with zero mean, yet for Cov(x,y)=0. Take, for instance, x=cos(θ) and y=sin(θ) for θ uniformly distributed on [0,2π).
whuber

@whuber, yes, I agree. The mistake in Aksakal's argument is that individual elements of U are definitely not standard normal! If the sign of each column is randomized, then (in my simulation) the mean of each Uij is around 0 and the variance is around 1/n, which makes total sense -- add up n variances in one column and you will get n1/n=1, as required by the constraint. This is assuming the elements are uncorrelateed, which they seem to be.
amoeba says Reinstate Monica

1
@Aksakal, I invite you to run a simulation and see for yourself that they are indeed uncorrelated; just be sure to randomize the sign of each column of U on each iteration. If you want an intuitive proof, observe that there is nothing "special" about any particular row of X, meaning that if correlation between U11 and U21 is ρ, then it must be the same for any other pair. So we have n random variables with correlation matrix having all off-diagonal elements equal to ρ. Now, is ρ positive or negative? The problem doesn't seem to offer a choice, hence ρ=0.
amoeba says Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.