Saya ingin dapat menghasilkan matriks korelasi positif-semidefinit (PSD) secara efisien. Metode saya melambat secara dramatis ketika saya meningkatkan ukuran matriks yang akan dihasilkan.
- Bisakah Anda menyarankan solusi yang efisien? Jika Anda mengetahui ada contoh di Matlab, saya akan sangat berterima kasih.
- Saat membuat matriks korelasi PSD bagaimana Anda memilih parameter untuk menggambarkan matriks yang akan dihasilkan? Korelasi rata-rata, standar deviasi korelasi, nilai eigen?
random-generation
correlation-matrix
Eduardas
sumber
sumber
Jawaban:
Anda dapat melakukannya mundur: setiap matriksC∈Rp++ (himpunan semua matriks p×p PSD simetris ) dapat didekomposisi sebagai
Untuk mendapatkanO , pertama-tama buat basis acak (v1,...,vp) (di mana vi adalah vektor acak, biasanya dalam (−1,1) ). Dari sana, gunakan proses ortogonisasi Gram-Schmidt untuk mendapatkan (u1,....,up)=O
Akhirnya, adalah matriks diagonal yang elemen-elemennya semuanya positif (ini, sekali lagi, mudah untuk menghasilkan: menghasilkan angka acak , kuadratinya, mengurutkannya dan menempatkannya ke diagonal identitas dengan matriks ).p p pD p p hal
sumber
Sebuah makalah Menghasilkan matriks korelasi acak berdasarkan tanaman merambat dan metode bawang yang diperluas oleh Lewandowski, Kurowicka, dan Joe (LKJ), 2009, memberikan pengobatan terpadu dan paparan dua metode yang efisien untuk menghasilkan matriks korelasi acak. Kedua metode memungkinkan untuk menghasilkan matriks dari distribusi yang seragam dalam arti tertentu yang didefinisikan di bawah ini, mudah diterapkan, cepat, dan memiliki keuntungan tambahan karena memiliki nama yang lucu.
Matriks simetris sungguhan ukuran dengan yang ada di diagonal memiliki elemen off-diagonal yang unik dan dengan demikian dapat ditentukan sebagai titik dalam . Setiap titik dalam ruang ini sesuai dengan matriks simetris, tetapi tidak semua dari mereka adalah positif-pasti (seperti matriks korelasi harus). Matriks korelasi membentuk subset dari (sebenarnya subset cembung yang terhubung), dan kedua metode dapat menghasilkan poin dari distribusi yang seragam pada subset ini.d ( d - 1 ) / 2 R d ( d - 1 ) / 2d× d d( d- 1 ) / 2 Rd( d- 1 ) / 2 Rd( d- 1 )/ 2
Saya akan memberikan implementasi MATLAB saya sendiri untuk setiap metode dan menggambarkannya dengan .d= 100
Metode bawang
Metode bawang berasal dari makalah lain (ref # 3 di LKJ) dan memiliki namanya dengan fakta bahwa matriks korelasi dihasilkan mulai dengan matriks dan menumbuhkannya kolom demi kolom dan baris demi baris. Distribusi yang dihasilkan seragam. Saya tidak begitu mengerti matematika di balik metode ini (dan lebih memilih metode kedua), tetapi inilah hasilnya:1 × 1
Di sini dan di bawah judul setiap subplot menunjukkan nilai eigen terkecil dan terbesar, dan penentu (produk dari semua nilai eigen). Ini kodenya:
Metode bawang merah yang diperluas
LKJ memodifikasi metode ini sedikit, agar dapat mengambil sampel matriks korelasi dari distribusi yang sebanding dengan . Semakin besar , semakin besar akan menjadi penentu, yang berarti bahwa matriks korelasi yang dihasilkan akan semakin mendekati matriks identitas. Nilai sesuai dengan distribusi seragam. Pada gambar di bawah ini, matriks dihasilkan dengan . [ d e tC η η = 1 η = 1 , 10 , 100 , 1000 , 10[ D e tC ]η- 1 η η= 1 η= 1 , 10 , 100 , 1000 , 10000 , 100000
Untuk beberapa alasan untuk mendapatkan determinan dengan urutan yang sama besarnya seperti pada metode bawang vanili, saya perlu meletakkan dan bukan (seperti yang diklaim oleh LKJ). Tidak yakin di mana kesalahannya.η = 1η= 0 η= 1
Metode anggur
Metode Vine pada awalnya disarankan oleh Joe (J dalam LKJ) dan ditingkatkan oleh LKJ. Saya lebih menyukainya, karena secara konsep lebih mudah dan juga lebih mudah untuk dimodifikasi. Idenya adalah untuk menghasilkan korelasi parsial (mereka independen dan dapat memiliki nilai dari tanpa kendala) dan kemudian mengubahnya menjadi korelasi mentah melalui rumus rekursif. Lebih mudah mengatur komputasi dalam urutan tertentu, dan grafik ini dikenal sebagai "anggur". Yang penting, jika korelasi parsial diambil dari distribusi beta tertentu (berbeda untuk sel yang berbeda dalam matriks), maka matriks yang dihasilkan akan didistribusikan secara seragam. Di sini, LKJ memperkenalkan parameter tambahan untuk sampel dari distribusi yang proporsional[ - 1 , 1 ] η [ d e td( d- 1 ) / 2 [ - 1 , 1 ] η [ D e tC ]η- 1 . Hasilnya identik dengan bawang merah yang diperluas:
Metode Vine dengan pengambilan sampel manual korelasi parsial
Seperti yang dapat dilihat di atas, distribusi yang seragam menghasilkan matriks korelasi yang hampir diagonal. Tetapi orang dapat dengan mudah memodifikasi metode anggur untuk memiliki korelasi yang lebih kuat (ini tidak dijelaskan dalam makalah LKJ, tetapi langsung): untuk yang ini harus sampel korelasi parsial dari distribusi yang terkonsentrasi sekitar . Di bawah ini saya sampel dari distribusi beta (dihitung ulang dari menjadi ) dengan . Semakin kecil parameter distribusi beta, semakin terkonsentrasi di dekat tepi.[ 0 , 1 ] [ - 1 , 1 ] α = β = 50 , 20 , 10 , 5 , 2± 1 [ 0 , 1 ] [ - 1 , 1 ] α = β= 50 , 20 , 10 , 5 , 2 , 1
Perhatikan bahwa dalam hal ini distribusi tidak dijamin sebagai permutasi invarian, jadi saya juga secara acak mengubah baris dan kolom setelah generasi.
Berikut adalah bagaimana histogram elemen off-diagonal mencari matriks di atas (varians dari distribusi meningkat secara monoton):
Pembaruan: menggunakan faktor acak
Salah satu metode yang sangat sederhana untuk menghasilkan matriks korelasi acak dengan beberapa korelasi kuat digunakan dalam jawaban oleh @ shabbychef, dan saya ingin mengilustrasikannya di sini juga. Idenya adalah untuk secara acak menghasilkan beberapa ( ) loadings faktor (matriks acak ukuran ), membentuk matriks kovarians (yang tentu saja tidak akan peringkat penuh ) dan tambahkan padanya matriks diagonal acak dengan elemen positif untuk membuat peringkat penuh. Matriks kovarians yang dihasilkan dapat dinormalisasi menjadi matriks korelasi, dengan membiarkank < d W k × d W W⊤ D B = W W⊤+ D C = E- 1 / 2B E- 1 / 2 , Di mana adalah matriks diagonal dengan diagonal yang sama seperti . Ini sangat sederhana dan bermanfaat. Berikut adalah beberapa contoh matriks korelasi untuk :E B k = 100 , 50 , 20 , 10 , 5 , 1
Dan kodenya:
Berikut adalah kode pembungkus yang digunakan untuk menghasilkan angka:
sumber
Karakterisasi yang bahkan lebih sederhana adalah bahwa untuk matriks nyata , adalah semidefinit positif. Untuk melihat mengapa hal ini terjadi, kita hanya perlu membuktikan bahwa untuk semua vektor (dengan ukuran yang tepat, tentu saja). Ini sepele:yang tidak negatif. Jadi di Matlab, coba sajaSEBUAH y T ( A T A ) y ≥ 0 y y T ( A T A ) y = ( A y ) T A y = | | A y | |SEBUAHTSEBUAH yT( ATA ) y≥ 0 y yT( ATA ) y= ( A y)TA y= | |A y| |
Bergantung pada aplikasinya, ini mungkin tidak memberi Anda distribusi nilai eigen yang Anda inginkan; Jawaban Kwak jauh lebih baik dalam hal itu. Nilai eigen yang
X
dihasilkan oleh cuplikan kode ini harus mengikuti distribusi Marchenko-Pastur.Untuk mensimulasikan matriks korelasi saham, katakanlah, Anda mungkin menginginkan pendekatan yang sedikit berbeda:
sumber
Sebagai variasi jawaban kwak: hasilkan matriks diagonal dengan nilai eigen nonnegatif acak dari distribusi pilihan Anda, dan kemudian lakukan transformasi kemiripan dengan sebuah matriks orthogonal pseudorandom yang didistribusikan secara Haar .A = Q D Q T QD A = Q D QT Q
sumber
Anda belum menentukan distribusi untuk matriks. Dua yang umum adalah distribusi Wishart dan terbalik Wishart. The Bartlett dekomposisi memberikan factorisation Cholesky dari matriks acak Wishart (yang juga dapat diselesaikan secara efisien untuk mendapatkan inverse acak Wishart matrix).
Faktanya, ruang Cholesky adalah cara yang mudah untuk menghasilkan jenis matriks PSD acak lainnya, karena Anda hanya perlu memastikan bahwa diagonalnya non-negatif.
sumber
sumber
Jika Anda ingin memiliki kontrol lebih besar atas matriks PSD simetris yang Anda hasilkan, mis. Menghasilkan dataset validasi sintetis, Anda memiliki sejumlah parameter yang tersedia. Matriks PSD simetris sesuai dengan hiper-elips di ruang dimensi-N, dengan semua derajat kebebasan yang terkait:
Jadi, untuk matriks 2 dimensi (yaitu elips 2d), Anda akan memiliki 1 rotasi + 2 sumbu = 3 parameter.
sumber
Pendekatan murah dan ceria yang saya gunakan untuk pengujian adalah menghasilkan m N (0,1) n-vektor V [k] dan kemudian menggunakan P = d * I + Jumlah {V [k] * V [k] '} sebagai matriks psn nxn. Dengan m <n ini akan tunggal untuk d = 0, dan untuk d kecil akan memiliki angka kondisi tinggi.
sumber