Яке поєднання структур даних ефективно зберігає дискретні байєсівські мережі?


22

Я розумію теорію байєсівських мереж і мені цікаво, що потрібно для її побудови на практиці. Скажімо для цього прикладу, що у мене є байєсова (спрямована) мережа з 100 дискретних випадкових змінних; кожна змінна може приймати одне до 10 значень.

Чи зберігаю я всі вузли в DAG, а для кожного вузла зберігаю свою Таблицю умовної ймовірності (CPT)? Чи є інші структури даних, які я повинен використовувати для забезпечення ефективного обчислення значень при зміні деяких CPT (крім тих, які використовуються DAG)?


Я використовую базу даних sqlite пам'яті для зберігання таблиць CP, оскільки, як очікується, БД мають ефективні алгоритми та структури даних для роботи з таблицями. Добре працює! :)
Pratik Deoghare

Будь-ласка, визначте, що ви маєте на увазі під ефективним (пам'ять, продуктивність тощо) та включіть свої обмеження. Без них це може легко закінчити конкурс на найбільш ефективний , який буде деградувати до загадкового коду , який я ніколи не хочу мати справу в повсякденній роботі.
Джастін Бозоньє

1
@JustinBozonier вимагає менше пам’яті та швидкий?
Pratik Deoghare

Відповіді:


12

"Найкраща" структура даних, ймовірно, залежить від конкретної проблеми, яку ви намагаєтеся вирішити. Ось один із підходів, який я бачив (і використовував сам), який просто зберігає всю інформацію і залишає її за алгоритмом, що з нею робити.

  1. Спочатку ви індексуєте вузли за унікальними цілими числами, від 0 до n-1. Тоді ви просто зберігаєте для кожного вузла список його батьків як масив цілих чисел --- у C ++, наприклад, у вас може бути std::vector<std::vector<int> >: перший вектор над вузлами, другий вектор - списки відповідних батьків). Це захоплює всю структуру DAG.

  2. Крім того, оскільки кожен вузол має точно одну таблицю умовної ймовірності, пов'язаної з ним, ви можете індексувати ті, хто має однакові цілі ідентифікатори. Для кожної таблиці ймовірностей вам потрібно зберігати область її застосування, тобто набір випадкових змінних, визначених за нею. По-друге, напевно, у вас є один великий список номерів з плаваючою комою, який містить фактичні умовні ймовірності (і ви хочете переконатися, що ви отримали право індексації). Щоб знову навести приклад C ++, щось подібне може зробити:

    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
    };
    

    З цим ви можете використовувати a std::vector<CondProbTable>для зберігання всіх ваших CPT.

Знову ж таки, це в основному зберігає сітку Байєса, вона не передбачає нічого про те, що ви хочете з цим зробити. Включення області CPT в CondProbTable дещо зайве, оскільки це може бути виведено зі списку батьківських вузлів, описаних у пункті 1.


0

В основному дискретні CPT - це гіперматриці, і ви повинні дивитися на них таким чином.

Досить поширеним способом представити гіперматрицю є використання хештеля за допомогою рядкового індексу. наприклад, у 2 вимірах t [1] [2] буде t.get ("1_2")

Можливіші ефективніші в пам'яті рішення: Якщо гіперматриця є рідкою, ви можете використовувати спеціальне розріджене представлення (наприклад, Fuchs 72), якщо вона має структуру, ви можете використовувати ADD (алгребраїчна схема рішення) або правила, засновані на логіці.

Ваше останнє запитання не дуже зрозуміло, проте, якщо ви очікували, що ваш CPT часто змінюється, вам, ймовірно, буде краще, якщо ви будете чітко представлені CPT або з таблицею, або з хештелем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.