Hangi veri yapılarının kombinasyonu, ayrık Bayesian ağlarını etkin şekilde depolar?


22

Bayes ağlarının ardındaki teoriyi anlıyorum ve pratikte bir tane inşa etmenin ne olduğunu merak ediyorum. Diyelim ki bu örnek için, 100 ayrık rastgele değişkenli bir Bayesian (yönlendirilmiş) ağım var; her değişken en fazla 10 değerden birini alabilir.

Tüm düğümleri bir DAG'da ve her düğüm için Koşullu Olasılık Tablosunu (CPT) saklıyor muyum? Bazı CPT'ler değiştiğinde değerlerin verimli bir şekilde hesaplanmasını sağlamak için kullanmam gereken başka veri yapıları var mı (bir DAG tarafından kullanılanlar dışında)?


CP tablolarını depolamak için bellek sqlite veritabanında kullanıyorum, çünkü DB'lerin tablolarla başa çıkacak verimli algoritmalara ve veri yapılarına sahip olmaları bekleniyor. İyi çalışıyor! :)
Pratik Deoghare

Lütfen ne demek istediğinizi verimli (bellek, performans vb.) Tanımlayın ve sınırlamalarınızı ekleyin. O olmadan bu kolaylıkla için bir yarışma bitebileceğini en Ben gün iş günü içinde uğraşmak zorunda hiç istemezdim şifreli kod yetmediği noktada etkili.
Justin Bozonier

1
@JustinBozonier daha az bellek gerektirir ve hızlı mı?
Pratik Deoghare

Yanıtlar:


12

"En iyi" veri yapısı muhtemelen hangi sorunu çözmeye çalıştığınıza bağlıdır. İşte gördüğüm (ve kendimi kullandığım), tüm bilgiyi saklayan ve onu ne yapacağını algoritmaya bırakan bir yaklaşım.

  1. İlk önce düğümleri benzersiz tam sayılarla, 0 ile n-1 arasında indekslersiniz. Sonra basitçe, her bir düğüm için, ebeveynlerinin listesini bir tamsayı dizisi olarak depolarsınız --- örneğin, C ++ 'a sahip olabilirsiniz std::vector<std::vector<int> >: düğümlerin üzerinde ilk vektör, ikinci vektör ilgili ebeveynleri listeler). Bu, DAG yapısının tamamını yakalar.

  2. Ayrıca, her düğüm, kendisiyle ilişkilendirilmiş tek bir koşullu olasılık tablosuna sahip olduğundan, aynı tamsayı kimliğine sahip olanları endeksleyebilirsiniz. Her olasılık tablosu için kapsamını, yani tanımlandığı rastgele değişkenleri kümesini kaydetmeniz gerekir. İkincisi, muhtemelen gerçek koşullu olasılıkları içeren büyük bir kayan nokta sayıları listesine sahip olacaksınız (ve indekslemeyi doğru yaptığınızdan emin olmak isteyeceksiniz). C ++ örneğini tekrar vermek için, bunun gibi bir şey yapabilir:

    struct CondProbTable {
        std::vector<int> scope;    // list of random variables the CPT is defined over
        std::vector<double> table; // appropriately sized and indexed table of
                                   // conditional probabilities
    };
    

    Bununla, std::vector<CondProbTable>tüm CPT'lerinizi saklamak için a kullanabilirsiniz .

Yine, bu temelde yalnızca Bayes ağını depolar, onunla ne yapmak istediğiniz hakkında hiçbir şey düşünmez. CPT kapsamını CondProbTable'a dahil etmek biraz gereksizdir, çünkü 1. maddede açıklanan ana düğümler listesinden çıkarılabilir.


0

Temelde ayrık CPT hipermatriklerdir ve bunlara bu şekilde bakmalısınız.

Bir hipermatriyi temsil etmenin oldukça yaygın bir yolu, dize indeksi kullanarak bir karma tablo kullanmaktır. örneğin 2 boyutta t [1] [2] t.get ("1_2") olur

Daha fazla bellek verimli çözüm mümkündür: Hipermatris seyrekse, özel seyrek gösterimi kullanabilirsiniz (örn. Fuchs 72), eğer yapısı varsa, ADD (cebirsel karar diyagramı) veya mantık tabanlı kuralları kullanabilirsiniz.

Son sorunuz çok net değil, ancak eğer CPT'nizin sık sık değişmesini beklerseniz, muhtemelen bir tablo veya bir karma tablo ile CPT'nin düz bir şekilde temsil edilmesinden daha iyi olursunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.