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 sampel dari dimensi Gaussian dengan nol mean dan kovarian identitas: . Aku mengumpulkan mereka di matriks data . (Saya dapat opsional pusat atau tidak, itu tidak mempengaruhi berikut.) Lalu aku melakukan dekomposisi nilai singular (SVD) untuk mendapatkan . Mari kita ambil dua elemen tertentu dari , misalnya dan , dan tanyakan apa korelasi di antara mereka di berbagai imbang berbeda. Saya akan berharap bahwa jika jumlah 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 ) antara , , , dan , dan hanya di antara elemen-elemen ini. Semua pasangan elemen lainnya memiliki korelasi sekitar nol, seperti yang diharapkan. Berikut adalah bagaimana matriks korelasi untuk elemen "atas" dari terlihat ( elemen pertama dari kolom pertama, kemudian elemen pertama dari kolom kedua):
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')
sumber
Jawaban:
Ini bukan bug.
Seperti yang telah kami jelajahi (ekstensif) dalam komentar, ada dua hal yang terjadi. Yang pertama adalah bahwa kolomU 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 komponenU , 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 komponenU . 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
svd
algoritma di Windows 7R
dan 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.
Menggunakank 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."
R
'ssvd
prosedur, pertama Anda dapat memeriksa bahwa sebagaiKedua, 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 koefisienU . 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 1000 realisasi dari matriks 4×2 U , menciptakan matriks 1000×8 . Berikut ini adalah matriks sebar penuhnya, dengan variabel-variabel yang dicantumkan berdasarkan posisi mereka di dalam U :
Memindai bawah kolom pertama mengungkapkan kurangnya menarik kemerdekaan antarau11 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 dengank=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 mendapatkanU 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: kolomU 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,ui′j′) . Jika Anda ingin melihat ini, ganti
stat
fungsi dalam kode di bawah ini denganIni pertama secara acak memesan kembali pengamatanui,j dan ui,j′ ).
x
, melakukan SVD, kemudian menerapkan urutan terbaliku
agar 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 antaraKurangnya data di beberapa kuadran dari beberapa plot sebar asli (ditunjukkan pada gambar di atas) muncul dari bagaimana
R
algoritma SVD memilih tanda untuk kolom.Tidak ada yang berubah tentang kesimpulan. Karena kolom kedua dariU 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 adalahk>2 dan menggambar sebagian dari matriks sebar.
R
kode yang diperbarui untuk menangani kasingsumber
svd(X,0)
dengan menggantisvds(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 Matlabsvds
, tetapi saya bertanya-tanya apakah Anda masih akan mempertahankan bahwa itu adalah efek "nyata" dan bukan masalah numerik.U
Anda memutuskan secara acak apakah masing-masing kolomnya akan tetap seperti apa adanya atau akan mengubah tandanya, bukankah kemudian korelasi yang Anda bicarakan menghilang?stat
S
berada dalam urutan tertentu; ini masalah kenyamanan. Rutinitas lain menjamin ini (mis. MATLABsvds
) tetapi itu bukan persyaratan umum. @amoeba: Melihatsvds
(yang tampaknya bebas dari perilaku bermasalah ini) perhitungan didasarkan pada benar-benar menghitung nilai eigen pertama (sehingga tidak menggunakan rutin standardgesdd
/dgesvd
LAPACK - Saya sangat curiga menggunakandsyevr
/dsyevx
pada awalnya).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:
Di sebelah kiri adalah matriks korelasi, di sebelah kanan - sebar plot mirip dengan @ whuber's. Kesepakatan antara simulasi kami tampaknya sempurna.
Saya menambahkan dua baris berikut:
Inilah hasilnya:
Semua korelasi menghilang, persis seperti yang saya harapkan dari awal !
PS. Selamat kepada @whuber karena telah melampaui reputasi 100rb hari ini!
sumber
stat
dalam 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 kolomsvds
olehsvd
diikuti oleh pilihan tanda acak untuk kolomR
. 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 sekitarCheck 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 variablesx and y with the constraint that the sum of their squares is 1:
Assume that the means are zero, then
This will not be equal to zero. You can plug the standard normal intox and y to see what's the value of covariance to be expected here.
sumber