Saya memahami teori di balik jaringan Bayesian, dan saya bertanya-tanya apa yang diperlukan untuk membangun satu dalam praktik. Katakanlah untuk contoh ini, bahwa saya memiliki jaringan Bayesian (diarahkan) dengan 100 variabel acak diskrit; setiap variabel dapat mengambil satu hingga 10 nilai.
Apakah saya menyimpan semua node dalam DAG, dan untuk setiap node menyimpan Tabel Kemungkinan Bersyarat (CPT)? Apakah ada struktur data lain yang harus saya gunakan untuk memastikan perhitungan nilai yang efisien ketika beberapa CPT berubah (selain dari yang digunakan oleh DAG)?
Jawaban:
Struktur data "terbaik" mungkin tergantung pada masalah khusus apa yang Anda coba selesaikan. Inilah salah satu pendekatan yang pernah saya lihat (dan telah digunakan sendiri), yang hanya menyimpan semua informasi dan menyerahkannya kepada algoritma apa yang harus dilakukan dengannya.
Pertama, Anda mengindeks node dengan bilangan bulat unik, 0 hingga n-1. Kemudian Anda cukup menyimpan, untuk setiap node, daftar orang tuanya sebagai array integer --- dalam C ++, misalnya, Anda dapat memiliki
std::vector<std::vector<int> >
: vektor pertama di atas node, vektor kedua mencantumkan orang tua masing-masing). Itu menangkap seluruh struktur DAG.Selain itu, karena setiap node memiliki tepat satu tabel probabilitas bersyarat yang terkait dengannya, Anda bisa mengindeks mereka dengan ID integer yang sama. Untuk setiap tabel probabilitas Anda perlu menyimpan ruang lingkupnya, yaitu himpunan variabel acak yang didefinisikan. Kedua, Anda mungkin memiliki satu daftar besar angka floating point yang berisi probabilitas kondisional aktual (dan Anda ingin memastikan Anda mendapatkan pengindeksan yang benar). Untuk memberikan contoh C ++ lagi, sesuatu seperti ini bisa dilakukan:
Dengan itu, Anda bisa menggunakan a
std::vector<CondProbTable>
untuk menyimpan semua CPT Anda.Sekali lagi, ini pada dasarnya hanya menyimpan jaring Bayes, itu tidak menganggap apa pun tentang apa yang ingin Anda lakukan dengannya. Termasuk ruang lingkup CPT di CondProbTable agak berlebihan, karena bisa disimpulkan dari daftar node induk yang dijelaskan pada poin 1.
sumber
Pada dasarnya CPT diskrit adalah hypermatrix, dan Anda harus melihatnya dengan cara ini.
Cara yang cukup umum untuk merepresentasikan hypermatrix adalah dengan menggunakan hashtable using string index. misal dalam 2 dimensi t [1] [2] adalah t.get ("1_2")
Lebih banyak solusi efisien memori yang mungkin: Jika hypermatrix jarang, Anda dapat menggunakan representasi jarang (misalnya Fuchs 72), jika memiliki struktur Anda dapat menggunakan ADD (diagram keputusan aljabar), atau aturan berbasis logika.
Pertanyaan terakhir Anda tidak terlalu jelas, namun jika Anda mengharapkan CPT Anda sering berubah, mungkin Anda akan lebih baik dengan representasi datar CPT dengan tabel atau hashtable.
sumber