बेयेशियन नेटवर्क को असतत रूप से स्टोर करने वाली डेटा संरचनाओं का क्या संयोजन है?


22

मैं बायेसियन नेटवर्क के पीछे के सिद्धांत को समझता हूं, और सोच रहा हूं कि व्यवहार में इसे बनाने में क्या लगता है। आइए इस उदाहरण के लिए कहें, कि मेरे पास 100 असतत यादृच्छिक चर का बायेसियन (निर्देशित) नेटवर्क है; प्रत्येक चर 10 मान तक ले सकता है।

क्या मैं सभी नोड्स को DAG में संग्रहीत करता हूं, और प्रत्येक नोड के लिए इसकी सशर्त संभाव्यता तालिका (CPT) को संग्रहीत करता है? क्या कुछ डेटा संरचनाएँ हैं जिनका उपयोग मुझे कुछ सीपीटी बदलने (डीएजी द्वारा उपयोग किए जाने के अलावा) के मूल्यों की कुशल गणना सुनिश्चित करने के लिए करना चाहिए?


मैं सीबी तालिकाओं के भंडारण के लिए मेमोरी साइक्लाईट डेटाबेस का उपयोग कर रहा हूं, क्योंकि डीबी से तालिकाओं से निपटने के लिए कुशल एल्गोरिदम और डेटा संरचनाएं होने की उम्मीद है। ठीक काम करता है! :)
प्रतीक देवघर

कृपया परिभाषित करें कि आप कुशल (मेमोरी, प्रदर्शन, आदि) से क्या मतलब है और अपनी बाधाओं को शामिल करें। उन लोगों के बिना यह आसानी से सबसे कुशल के लिए एक प्रतियोगिता को समाप्त कर सकता है जो कि गुप्त कोड को नीचा दिखाएगा मैं कभी भी दिन के काम से निपटना नहीं चाहता हूं।
जस्टिन बोज़ोनियर

1
@JustinBozonier को कम मेमोरी की आवश्यकता होती है और तेज है?
प्रतीक देवघर

जवाबों:


12

"सर्वश्रेष्ठ" डेटा संरचना संभवतः इस बात पर निर्भर करती है कि आप किस विशेष समस्या को हल करने की कोशिश कर रहे हैं। यहां एक दृष्टिकोण है जो मैंने देखा है (और खुद का इस्तेमाल किया है), जो बस सभी जानकारी संग्रहीत करता है और इसे एल्गोरिथ्म तक छोड़ देता है कि इसके साथ क्या करना है।

  1. पहले आप अद्वितीय पूर्णांकों द्वारा नोड्स को इंडेक्स करते हैं, 0 एन -1 के माध्यम से। फिर आप बस प्रत्येक नोड के लिए, पूर्णांक की एक सरणी के रूप में उसके माता-पिता की सूची --- सी ++ में, उदाहरण के लिए, आपके पास हो सकता है 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
    };
    

    इसके साथ, आप std::vector<CondProbTable>अपने सभी CPT को संग्रहीत करने के लिए a का उपयोग कर सकते हैं ।

फिर से, यह मूल रूप से केवल बेयस नेट को संग्रहीत करता है, यह इस बारे में कुछ भी ग्रहण नहीं करता है कि आप इसके साथ क्या करना चाहते हैं। CondProbTable में CPT का दायरा शामिल करना कुछ हद तक बेमानी है, क्योंकि यह बिंदु 1 के तहत वर्णित मूल नोड्स की सूची से अनुमान लगाया जा सकता है।


0

मूल रूप से असतत सीपीटी हाइपरमेट्रिक्स हैं, और आपको उन्हें इस तरह से देखना चाहिए।

हाइपरमेट्रिक्स का प्रतिनिधित्व करने का एक बहुत ही सामान्य तरीका है स्ट्रिंग सूचकांक का उपयोग करके हैशटेबल का उपयोग करना। जैसे 2 आयामों में t [1] [2] t.get ("1_2") होगा

अधिक मेमोरी कुशल समाधान संभव है: यदि हाइपरमेट्रिक्स विरल है, तो आप विशेष विरल प्रतिनिधित्व (जैसे कि फुक्स 72) का उपयोग कर सकते हैं, यदि इसकी संरचना आपके पास ADD (एल्ग्रेजिक डिसीजन आरेख), या तर्क-आधारित नियमों का उपयोग कर सकती है।

आपका अंतिम प्रश्न बहुत स्पष्ट नहीं है, हालांकि यदि आपने अपने सीपीटी को अक्सर बदलने की उम्मीद की है, तो संभवतः आप टेबल या हैशटेबल के साथ सीपीटी के एक फ्लैट प्रतिनिधित्व के साथ बेहतर होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.