Mensimulasikan posterior proses Gaussian

8

Untuk pertama kalinya (alasan ketidaktepatan / kesalahan) saya melihat proses Gaussian , dan lebih khusus lagi, menonton video ini oleh Nando de Freitas . Catatan tersedia online di sini .

Pada titik tertentu ia menggambar sampel acak dari normal multivariat yang dihasilkan dengan membuat matriks kovarians berdasarkan pada kernel Gaussian (eksponensial jarak kuadrat dalam sumbu ). Sampel acak ini membentuk plot halus sebelumnya yang menjadi kurang tersebar saat data tersedia. Pada akhirnya, tujuannya adalah untuk memprediksi dengan memodifikasi matriks kovarians, dan mendapatkan distribusi Gaussian bersyarat pada titik yang diinginkan.10x

masukkan deskripsi gambar di sini

Seluruh kode tersedia pada ringkasan yang sangat baik oleh Katherine Bailey di sini , yang pada gilirannya akan memberikan repositori kode oleh Nando de Freitas di sini . Saya telah mempostingnya kode Python di sini untuk kenyamanan.

Ini dimulai dengan (bukan atas) fungsi sebelumnya, dan memperkenalkan "parameter tuning".310

Saya telah menerjemahkan kode ke Python dan [R] , termasuk plot:

Berikut adalah potongan kode pertama dalam [R] dan plot yang dihasilkan dari tiga kurva acak yang dihasilkan melalui kernel Gaussian berdasarkan kedekatan pada nilai dalam set tes:x

! [masukkan deskripsi gambar di sini

The potongan kedua kode R adalah hairier, dan dimulai dengan mensimulasikan empat poin data pelatihan, yang pada akhirnya akan membantu mempersempit penyebaran di antara kemungkinan kurva (sebelum) sekitar wilayah di mana titik data pelatihan tersebut berbohong. Simulasi nilai untuk titik data ini adalah sebagai fungsi . Kita bisa melihat "pengetatan kurva di sekitar titik":ysin()

masukkan deskripsi gambar di sini

The potongan ketiga kode R penawaran dengan memplot kurva rata nilai estimasi (setara dengan kurva regresi), sesuai dengan nilai-nilai (lihat perhitungan di bawah ini), dan interval kepercayaan mereka:50 μ

masukkan deskripsi gambar di sini

PERTANYAAN: Saya ingin meminta penjelasan tentang operasi yang terjadi ketika pergi dari GP sebelumnya ke posterior.

Secara khusus, saya ingin memahami bagian ini dari kode R (dalam potongan kedua) untuk mendapatkan sarana dan sd:

# Apply the kernel function to our training points (5 points):

K_train = kernel(Xtrain, Xtrain, param)                          #[5 x 5] matrix

Ch_train = chol(K_train + 0.00005 * diag(length(Xtrain)))        #[5 x 5] matrix

# Compute the mean at our test points:

K_trte = kernel(Xtrain, Xtest, param)                            #[5 x 50] matrix
core = solve(Ch_train) %*% K_trte                                #[5 x 50] matrix
temp = solve(Ch_train) %*% ytrain                                #[5 x 1] matrix
mu = t(core) %*% temp                                            #[50 x 1] matrix

Ada dua kernel (satu kereta ( ) v. Kereta ( ),, sebut saja , dengan Cholesky ( ), , mewarnai oranye semua Cholesky dari sini, dan yang kedua dari kereta ( ) v test ( ),, sebut saja ), dan untuk menghasilkan estimasi cara untuk poin dalam set pengujian, operasinya adalah:aaK_trainΣaaCh_trainLaaaeK_trteΣaeμ^50

(Eq.1)μ^=[Laa1[5×5]Σae[5×50]]TLaa1[5×5]ytr[5×1]dimensions=[50×1]
# Compute the standard deviation:

tempor = colSums(core^2)                                          #[50 x 1] matrix

# Notice that all.equal(diag(t(core) %*% core), colSums(core^2)) TRUE

s2 = diag(K_test) - tempor                                        #[50 x 1] matrix
stdv = sqrt(s2)                                                   #[50 x 1] matrix

(Eq.2)var^=diag(Σee)diag[[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]=d[1111]d[[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]dimensions=[50×1]

Bagaimana cara kerjanya?

Juga tidak jelas, apakah perhitungan untuk garis warna (Posterior GP) di plot " Tiga sampel dari posterior GP " di atas, di mana Cholesky dari set pengujian dan pelatihan tampaknya bersatu untuk menghasilkan nilai normal multivariat, akhirnya ditambahkan ke :μ^

Ch_post_gener = chol(K_test + 1e-6 * diag(n) - (t(core) %*% core))
m_prime = matrix(rnorm(n * 3), ncol = 3)
sam = Ch_post_gener %*% m_prime
f_post = as.vector(mu) + sam 

(Eq.3)fpost=μ^+[Lee[50×50][[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]][N(0,1)[50×3]]dimensions=[50×3]
Antoni Parellada
sumber
Dalam plot terakhir, bukankah seharusnya interval kepercayaan "mencubit" pada poin yang diketahui?
GeoMatt22
@ GeoMatt22 Mereka semacam itu, bukan begitu?
Antoni Parellada

Jawaban:

2

Ketika diberikan satu set tes, , nilai-nilai yang diharapkan akan dihitung dengan mempertimbangkan distribusi kondisional dari nilai fungsi untuk titik-titik data baru ini, mengingat titik-titik data dalam set pelatihan, . Gagasan yang diungkapkan dalam video adalah bahwa kita akan memiliki distribusi bersama dan (dalam ceramah yang dilambangkan dengan tanda bintang, ) dari bentuk:eaae

[ae]N([μaμe],[ΣaaΣaeΣaeTΣee])
.

The bersyarat dari distribusi Gaussian multivariat memiliki mean . Sekarang, mengingat bahwa baris pertama dari matriks blok kovariansi di atas adalah untuk , tetapi hanya untuk , wasiat yang dialihkan diperlukan untuk membuat matriks kongruen di:E(x1|x2)=μ1+Σ12Σ221(x2μ2)[50×50]Σaa[50×5]Σae

E(e|a)=μe+ΣaeTΣaa1(yμa)
Karena model ini direncanakan dengan , rumus disederhanakan dengan baik menjadi :μa=μe=0

E(e|a)=ΣaeTΣaa1ytr

Masukkan dekomposisi Cholesky (yang lagi-lagi saya akan kode oranye seperti di OP):

E(e|a)=ΣaeTΣaa1ytr<α>=ΣaeT(LaaLaaT)1ytr=ΣaeTLaaTLaa1ytr(*)=ΣaeTLaaTLaa1ytr<m>

Jika , maka , dan kita berakhir dengan sistem linear yang dapat kita selesaikan, memperoleh . Inilah slide kunci dalam presentasi asli:m=Laa1ytrLaam=ytrm


masukkan deskripsi gambar di sini


Karena , Persamaan. (*) adalah setara dengan persamaan (1) dalam OP:BTAT=(AB)T

μ^=[Laa1[5×5]Σae[5×50]]TLaa1[5×5]ytr[5×1]=(ΣaeTLaaT)(Laa1ytr)dimensions=[50×1]

mengingat bahwa

[Laa1[5×5]Σae[5×50]]T=Σae[50×5]TLaa1T[5×5]

Alasan yang serupa akan diterapkan pada varians, dimulai dengan rumus untuk varian bersyarat dalam Gaussian multivarian:

var(x1|x2)=Σ11Σ12Σ221Σ21

yang dalam kasus kami adalah:

varμ^e=ΣeeΣaeTΣaa1Σae=ΣeeΣaeT[LaaLaaT]1Σae=ΣeeΣaeT[Laa1]TLaa1Σae=Σee[Laa1Σae]TLaa1Σae

dan tiba di Persamaan (2):

varμ^e=d[Kee[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]dimensions=[50×1]

Kita dapat melihat bahwa Persamaan (3) dalam OP adalah cara untuk menghasilkan kurva acak posterior yang bergantung pada data (set pelatihan), dan memanfaatkan formulir Cholesky untuk menghasilkan tiga undian acak multivariat yang normal :

fpost=μ^+[varμ^e][rnorm(0,1)]=μ^+[Lee[50×50][[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]][rand.norm's[50×3]]dimensions=[50×3]
Antoni Parellada
sumber
1
Apakah ini dari buku atau kertas? Apakah Anda memiliki cara yang kuat untuk menghitung mean dan varians bersyarat ketika matriks kovarians sangat dikondisikan (tetapi tanpa menghapus atau menggabungkan titik data yang hampir bergantung (terdekat)) dalam presisi ganda? Multi-presisi dalam perangkat lunak berfungsi, tetapi memiliki 2,5 hingga 3 perintah pelambatan magnitudo vs. hardware Double Precision, sehingga bahkan algoritma presisi ganda "lambat" pun akan baik. Saya tidak berpikir Cholesky memotongnya. Saya tidak berpikir bahkan QR juga baik ketika matriks kovarians sangat buruk. Menggunakan backsolves standar, tampaknya membutuhkan presisi tertutup.
Mark L. Stone