การรวมกันของโครงสร้างข้อมูลใดที่จัดเก็บเครือข่ายแบบเบย์โดยสิ้นเชิง


22

ฉันเข้าใจทฤษฎีที่อยู่เบื้องหลังเครือข่าย Bayesian และฉันสงสัยว่าจะต้องสร้างสิ่งใดในทางปฏิบัติ สมมุติว่าสำหรับตัวอย่างนี้ฉันมีเครือข่ายแบบเบย์ (กำกับ) ที่มีตัวแปรสุ่มไม่ต่อเนื่อง 100 ตัว ตัวแปรแต่ละตัวสามารถรับได้สูงสุด 10 ค่า

ฉันจะเก็บโหนดทั้งหมดใน DAG และสำหรับแต่ละโหนดจะเก็บ Conditional Probability Table (CPT) หรือไม่ มีโครงสร้างข้อมูลอื่น ๆ ที่ฉันควรใช้เพื่อให้แน่ใจว่าการคำนวณค่ามีประสิทธิภาพเมื่อ CPT บางอย่างเปลี่ยนไป (นอกเหนือจาก DAG ที่ใช้)


ฉันใช้ในฐานข้อมูลหน่วยความจำ sqlite สำหรับจัดเก็บตาราง CP เนื่องจากฐานข้อมูลคาดว่าจะมีอัลกอริทึมที่มีประสิทธิภาพและโครงสร้างข้อมูลเพื่อจัดการกับตาราง ทำงานได้ดี! :)
Pratik Deoghare

โปรดกำหนดสิ่งที่คุณหมายถึงโดยประสิทธิภาพ (หน่วยความจำประสิทธิภาพ ฯลฯ ) และรวมถึงข้อ จำกัด ของคุณ หากไม่มีสิ่งเหล่านี้ก็สามารถจบการแข่งขันได้อย่างง่ายดายสำหรับสิ่งที่มีประสิทธิภาพมากที่สุดซึ่งจะทำให้รหัสลับหายไปฉันไม่ต้องการจัดการกับงานประจำวัน
Justin Bozonier

1
@JustinBozonier ต้องการหน่วยความจำน้อยและรวดเร็ว?
Pratik Deoghare

คำตอบ:


12

โครงสร้างข้อมูล "ดีที่สุด" อาจขึ้นอยู่กับปัญหาเฉพาะที่คุณพยายามแก้ไข นี่เป็นวิธีหนึ่งที่ฉันได้เห็น (และใช้ตัวเอง) ซึ่งเก็บข้อมูลทั้งหมดและปล่อยให้เป็นอัลกอริทึมว่าจะทำอย่างไรกับมัน

  1. ขั้นแรกคุณสร้างดัชนีโหนดด้วยจำนวนเต็มเฉพาะ 0 ถึง n-1 จากนั้นคุณก็เก็บไว้ในแต่ละโหนดรายการของพาเรนต์เป็นอาร์เรย์ของจำนวนเต็ม --- ใน C ++ คุณสามารถมีstd::vector<std::vector<int> >: เวกเตอร์แรกเหนือโหนดส่วนเวกเตอร์ที่สองแสดงรายการพาเรนต์ที่เกี่ยวข้อง) ที่รวบรวมโครงสร้าง DAG ทั้งหมด

  2. นอกจากนี้เนื่องจากแต่ละโหนดมีตารางความน่าจะเป็นแบบมีเงื่อนไขหนึ่งตารางที่เชื่อมโยงอยู่คุณจึงสามารถสร้างดัชนีที่มี ID จำนวนเต็มเดียวกันได้ สำหรับตารางความน่าจะเป็นแต่ละตารางคุณจำเป็นต้องจัดเก็บขอบเขตไว้เช่นชุดของตัวแปรสุ่มที่กำหนดไว้ ประการที่สองคุณอาจมีรายการจำนวนจุดลอยตัวจำนวนมากที่มีความน่าจะเป็นตามเงื่อนไขจริง (และคุณต้องการให้แน่ใจว่าคุณได้รับการจัดทำดัชนีที่ถูกต้อง) หากต้องการให้ตัวอย่าง 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 ทั้งหมดของคุณ

อีกครั้งที่นี่เป็นเพียงเก็บ Bayes net มันไม่ได้คิดอะไรเกี่ยวกับสิ่งที่คุณต้องการจะทำกับมัน การรวมขอบเขต CPT ใน CondProbTable ค่อนข้างซ้ำซ้อนเนื่องจากสามารถสรุปได้จากรายการโหนดหลักที่อธิบายไว้ภายใต้จุดที่ 1


0

CPT ที่ไม่ต่อเนื่องโดยทั่วไปคือไฮเปอร์เมทริกซ์และคุณควรดูพวกมันด้วยวิธีนี้

วิธีที่ใช้กันทั่วไปในการแสดงไฮเปอร์เมทริกซ์คือการใช้ hashtable โดยใช้ดัชนีสตริง เช่นใน 2 มิติ t [1] [2] จะเป็น t.get ("1_2")

วิธีแก้ปัญหาที่มีประสิทธิภาพของหน่วยความจำมีความเป็นไปได้ที่มากขึ้น: ถ้า hypermatrix มีค่าน้อยคุณสามารถใช้การแทนแบบกระจัดกระจายพิเศษ (เช่น Fuchs 72) หากมีโครงสร้างคุณสามารถใช้ ADD (แผนภาพการตัดสินใจเชิงพีชคณิต) หรือกฎเชิงตรรกะ

คำถามสุดท้ายของคุณยังไม่ชัดเจนมากนักอย่างไรก็ตามหากคุณคาดหวังว่า CPT ของคุณจะเปลี่ยนบ่อยครั้งคุณอาจจะดีกว่าถ้าคุณใช้ CPT แบบเรียบๆแทนด้วยตารางหรือแฮชตาราง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.