Saya mencoba untuk mendapatkan pemahaman yang baik tentang algoritma EM, untuk dapat mengimplementasikan dan menggunakannya. Saya menghabiskan satu hari penuh membaca teori dan kertas di mana EM digunakan untuk melacak pesawat menggunakan informasi posisi yang berasal dari radar. Sejujurnya, saya pikir saya tidak sepenuhnya memahami ide yang mendasarinya. Adakah yang bisa mengarahkan saya ke contoh numerik yang menunjukkan beberapa iterasi (3-4) EM untuk masalah yang lebih sederhana (seperti memperkirakan parameter distribusi Gaussian atau urutan seri sinusoidal atau pemasangan garis).
Bahkan jika seseorang dapat mengarahkan saya ke sepotong kode (dengan data sintetis), saya dapat mencoba untuk menelusuri kode.
Jawaban:
Ini adalah resep untuk belajar EM dengan contoh 'Coin-Toss' yang praktis dan (menurut saya) sangat intuitif:
Baca makalah tutorial EM singkat ini oleh Do dan Batzoglou. Ini adalah skema tempat contoh lemparan koin dijelaskan:
Anda mungkin memiliki tanda tanya di kepala Anda, terutama mengenai dari mana probabilitas dalam langkah Ekspektasi berasal. Silakan lihat penjelasan di halaman pertukaran tumpukan matematika ini .
Lihat / jalankan kode ini yang saya tulis dengan Python yang mensimulasikan solusi untuk masalah coin-toss di kertas tutorial EM item 1:
sumber
pA_heads[j+1]
danpA_heads[j]
dan 2) perubahan antarapB_heads[j+1]
danpB_heads[j]
. Dan dibutuhkan maksimal dari dua perubahan. Sebagai contoh jikaDelta_A=0.001
danDelta_B=0.02
, peningkatan dari langkahj
kej+1
akan0.02
.delta
.Sepertinya pertanyaan Anda memiliki dua bagian: ide yang mendasarinya dan contoh konkret. Saya akan mulai dengan ide yang mendasarinya, kemudian tautan ke contoh di bagian bawah.
EM berguna dalam Catch-22 situasi di mana sepertinya Anda perlu tahu sebelum Anda dapat menghitung dan Anda perlu tahu sebelum Anda dapat menghitung .B B AA B B A
Kasus paling umum yang dihadapi adalah distribusi campuran. Sebagai contoh, mari kita lihat model campuran Gaussian sederhana:
Dan sekarang Anda terjebak:
Jika Anda tahu cara yang sebenarnya, Anda bisa mengetahui titik data mana yang berasal dari mana Gaussian. Misalnya, jika suatu titik data memiliki nilai yang sangat tinggi, itu mungkin berasal dari distribusi dengan rata-rata yang lebih tinggi. Tetapi Anda tidak tahu apa artinya itu, jadi ini tidak akan berhasil.
Jika Anda tahu dari mana asal masing-masing titik distribusi, maka Anda dapat memperkirakan sarana dua distribusi dengan menggunakan alat sampel dari titik-titik yang relevan. Tetapi Anda tidak benar-benar tahu poin mana yang harus ditetapkan untuk distribusi mana, jadi ini juga tidak akan berhasil.
Jadi tidak ada pendekatan yang berhasil: Anda harus tahu jawabannya sebelum Anda bisa menemukan jawabannya, dan Anda buntu.
Apa yang memungkinkan Anda lakukan EM adalah bergantian antara dua langkah yang bisa dilakukan ini alih-alih menangani seluruh proses sekaligus.
Anda harus mulai dengan menebak tentang dua cara (meskipun tebakan Anda tidak harus sangat akurat, Anda harus memulai suatu tempat).
Jika tebakan Anda tentang cara-cara itu akurat, maka Anda akan memiliki cukup informasi untuk melakukan langkah di poin pertama saya di atas, dan Anda dapat (secara probabilistik) menetapkan setiap titik data ke salah satu dari dua Gaussians. Meskipun kita tahu dugaan kita salah, mari kita coba saja. Dan kemudian, mengingat distribusi masing-masing titik yang ditentukan, Anda bisa mendapatkan perkiraan baru untuk sarana menggunakan poin kedua. Ternyata, setiap kali Anda melakukan loop melalui dua langkah ini, Anda meningkatkan batas bawah pada kemungkinan model.
Itu sudah sangat keren: meskipun kedua saran di poin-poin di atas sepertinya tidak akan bekerja secara individual, Anda masih dapat menggunakannya bersama-sama untuk meningkatkan model. The nyata keajaiban EM adalah bahwa, setelah cukup iterasi, batas bawah akan sangat tinggi sehingga ada tidak akan ada ruang antara itu dan maksimum lokal. Akibatnya, dan Anda telah mengoptimalkan kemungkinan secara lokal.
Jadi Anda belum memperbaiki model, Anda telah menemukan model terbaik yang dapat ditemukan dengan pembaruan tambahan.
Halaman ini dari Wikipedia menunjukkan contoh yang sedikit lebih rumit (Gaussians dua dimensi dan kovarian yang tidak diketahui), tetapi ide dasarnya sama. Ini juga termasuk
R
kode yang dikomentari dengan baik untuk menerapkan contoh.Dalam kode, langkah "Ekspektasi" (E-langkah) sesuai dengan poin-poin pertama saya: mencari tahu Gaussian mana yang bertanggung jawab untuk setiap titik data, mengingat parameter saat ini untuk setiap Gaussian. Langkah "Maksimalisasi" (langkah-M) memperbarui sarana dan kovarian, yang diberikan tugas ini, seperti pada poin kedua saya.
Seperti yang dapat Anda lihat dalam animasi, pembaruan ini dengan cepat memungkinkan algoritme beralih dari sekumpulan taksiran mengerikan ke sekumpulan yang sangat bagus: tampaknya memang ada dua titik awan yang berpusat pada dua distribusi Gaussian yang ditemukan EM.
sumber
Berikut adalah contoh dari Maksimalisasi Ekspektasi (EM) yang digunakan untuk memperkirakan mean dan standar deviasi. Kode ini dalam Python, tetapi harus mudah diikuti bahkan jika Anda tidak terbiasa dengan bahasa tersebut.
Motivasi untuk EM
Titik merah dan biru yang ditunjukkan di bawah ini diambil dari dua distribusi normal yang berbeda, masing-masing dengan mean dan standar deviasi tertentu:
Untuk menghitung perkiraan yang masuk akal dari mean "benar" dan parameter standar deviasi untuk distribusi merah, kita dapat dengan mudah melihat titik merah dan mencatat posisi masing-masing, dan kemudian menggunakan rumus yang sudah dikenal (dan juga untuk kelompok biru) .
Sekarang perhatikan kasus di mana kita tahu bahwa ada dua kelompok titik, tetapi kita tidak bisa melihat titik mana yang termasuk kelompok mana. Dengan kata lain, warnanya disembunyikan:
Sama sekali tidak jelas bagaimana membagi poin menjadi dua kelompok. Kami sekarang tidak dapat hanya melihat posisi dan menghitung estimasi untuk parameter distribusi merah atau distribusi biru.
Di sinilah EM dapat digunakan untuk menyelesaikan masalah.
Menggunakan EM untuk memperkirakan parameter
Berikut adalah kode yang digunakan untuk menghasilkan poin yang ditunjukkan di atas. Anda dapat melihat rata-rata aktual dan standar deviasi dari distribusi normal tempat titik diambil. Variabel
red
danblue
memegang posisi masing-masing titik dalam kelompok merah dan biru masing-masing:Jika kita dapat melihat warna setiap titik, kita akan mencoba dan memulihkan cara dan standar deviasi menggunakan fungsi pustaka:
Tapi karena warnanya tersembunyi dari kami, kami akan memulai proses EM ...
Pertama, kita hanya menebak nilai untuk parameter masing-masing kelompok ( langkah 1 ). Dugaan ini tidak harus bagus:
Tebakan yang cukup buruk - artinya terlihat jauh dari "tengah" kelompok poin mana pun.
Untuk melanjutkan EM dan meningkatkan tebakan ini, kami menghitung kemungkinan setiap titik data (terlepas dari warna rahasianya) yang muncul di bawah tebakan ini untuk mean dan standar deviasi ( langkah 2 ).
Variabel
both_colours
memegang setiap titik data. Fungsistats.norm
menghitung probabilitas titik di bawah distribusi normal dengan parameter yang diberikan:Ini memberi tahu kita, misalnya, bahwa dengan perkiraan kami saat ini, titik data di 1,761 jauh lebih mungkin untuk menjadi merah (0,189) daripada biru (0,00003).
Kami dapat mengubah dua nilai kemungkinan ini menjadi bobot ( langkah 3 ) sehingga jumlahnya menjadi 1 sebagai berikut:
Dengan perkiraan kami saat ini dan bobot kami yang baru dihitung, kami sekarang dapat menghitung estimasi baru, mungkin lebih baik, untuk parameter ( langkah 4 ). Kita membutuhkan fungsi untuk mean dan fungsi untuk deviasi standar:
Ini terlihat sangat mirip dengan fungsi biasa dengan mean dan standar deviasi data. Perbedaannya adalah penggunaan
weight
parameter yang memberikan bobot pada setiap titik data.Pembobotan ini adalah kunci EM. Semakin besar bobot warna pada suatu titik data, semakin banyak titik data tersebut mempengaruhi taksiran selanjutnya untuk parameter warna itu. Pada akhirnya, ini memiliki efek menarik setiap parameter ke arah yang benar.
Tebakan baru dihitung dengan fungsi-fungsi ini:
Proses EM kemudian diulangi dengan tebakan baru ini dari langkah 2 dan seterusnya. Kita dapat mengulangi langkah-langkah untuk sejumlah iterasi (katakanlah 20), atau sampai kita melihat parameter menyatu.
Setelah lima iterasi, kami melihat dugaan buruk awal kami mulai menjadi lebih baik:
Setelah 20 iterasi, proses EM memiliki lebih atau kurang konvergen:
Sebagai perbandingan, berikut adalah hasil dari proses EM dibandingkan dengan nilai yang dihitung di mana informasi warna tidak disembunyikan:
Catatan: jawaban ini diadaptasi dari jawaban saya di Stack Overflow di sini .
sumber
Mengikuti jawaban Zhubarb, saya menerapkan contoh “melempar koin” Do and Batzoglou di GNU R. Perhatikan bahwa saya menggunakan
mle
fungsistats4
paket - ini membantu saya untuk memahami lebih jelas bagaimana EM dan MLE terkait.sumber
Semua hal di atas terlihat seperti sumber yang bagus, tetapi saya harus menautkan ke contoh yang bagus ini. Ini menyajikan penjelasan yang sangat sederhana untuk menemukan parameter untuk dua baris dari serangkaian poin. Tutorialnya adalah oleh Yair Weiss saat berada di MIT.
http://www.cs.huji.ac.il/~yweiss/emTutorial.pdf
http://www.cs.huji.ac.il/~yweiss/tutorials.html
sumber
Jawaban yang diberikan oleh Zhubarb bagus, tapi sayangnya itu dalam Python. Di bawah ini adalah implementasi Java dari algoritma EM yang dieksekusi pada masalah yang sama (diajukan dalam artikel oleh Do and Batzoglou, 2008). Saya telah menambahkan beberapa printf ke output standar untuk melihat bagaimana parameter bertemu.
Kode Java berikut di bawah ini:
sumber
sumber
Baiklah, saya sarankan Anda membaca buku tentang R karya Maria L Rizzo. Salah satu bab berisi penggunaan algoritma EM dengan contoh numerik. Saya ingat membaca kode untuk pemahaman yang lebih baik.
Juga, cobalah untuk melihatnya dari sudut pandang pengelompokan di awal. Kerjakan dengan tangan, masalah pengelompokan di mana 10 pengamatan diambil dari dua kepadatan normal yang berbeda. Ini seharusnya membantu. Ambil bantuan dari R :)
sumber
sumber