Masalah yang sangat umum di Markov Chain Monte Carlo melibatkan probabilitas komputasi yang merupakan jumlah dari istilah eksponensial besar,
dimana komponen dapat berkisar dari sangat kecil sampai yang sangat besar. Pendekatan saya adalah memperhitungkan faktor eksponensial terbesar sehingga:
Pendekatan ini masuk akal jika semua elemen besar, tetapi bukan ide yang bagus jika tidak. Tentu saja, elemen yang lebih kecil tidak berkontribusi pada jumlah floating-point, tapi saya tidak yakin bagaimana cara mengatasinya dengan andal. Dalam kode R, pendekatan saya terlihat seperti:
if ( max(abs(a)) > max(a) )
K <- min(a)
else
K <- max(a)
ans <- log(sum(exp(a-K))) + K
Tampaknya masalah yang cukup umum bahwa harus ada solusi standar, tetapi saya tidak yakin apa itu. Terima kasih atas sarannya.
monte-carlo
floating-point
statistics
cboettig
sumber
sumber
Jawaban:
Ada solusi langsung dengan hanya dua melewati data:
pertama
yang memberitahu Anda bahwa, jika ada istilah, makan
Karena Anda mungkin tidak memiliki mendekati hampir , Anda tidak perlu khawatir meluap dalam perhitungan dalam presisi ganda .n 1020
Dengan demikian, hitung dan kemudian solusi Anda adalah .τ eKτ
sumber
Untuk menjaga ketepatan saat Anda menambahkan ganda bersama-sama Anda perlu menggunakan Penjumlahan Kahan , ini adalah perangkat lunak yang setara dengan membawa register.
Ini bagus untuk sebagian besar nilai, tetapi jika Anda mendapatkan overflow maka Anda mencapai batas presisi ganda IEEE 754 yang sekitar . Pada titik ini Anda memerlukan representasi baru. Anda dapat mendeteksi kelebihan pada waktu tambahan dengan dan juga mendeteksi eksponen ke besar untuk dievaluasi oleh . Pada titik ini Anda dapat memodifikasi interpretasi ganda dengan menggeser eksponen dan melacak pergeseran ini.e709.783
doubleMax - sumSoFar < valueToAdd
exponent > 709.783
Ini untuk sebagian besar adalah mirip dengan pendekatan Anda mengimbangi eksponen, tetapi versi ini disimpan di basis 2 dan tidak memerlukan pencarian awal untuk menemukan eksponen terbesar. Karenanya .value×2shift
sumber
Pendekatan Anda solid.
Anda tidak perlu tahu persis , cukup baik untuk menghindari overflow. Jadi, Anda mungkin dapat memperkirakan analitis sebelum Anda melakukan pengambilan sampel MCMC.KK K
sumber
Ada paket R yang memasok implementasi yang cepat dan efisien dari "trik log-sum-exp"
http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp
Fungsi logSumExp menerima vektor numerik lX dan output log (jumlah (exp (lX))) sambil menghindari masalah underflow dan overflow menggunakan metode yang Anda jelaskan.
sumber