Sự kết hợp nào của các cấu trúc dữ liệu lưu trữ hiệu quả các mạng Bayes rời rạc?


22

Tôi hiểu lý thuyết đằng sau các mạng Bayes và đang tự hỏi cần những gì để xây dựng một trong thực tế. Hãy nói ví dụ này, rằng tôi có một mạng Bayesian (có hướng) gồm 100 biến ngẫu nhiên rời rạc; mỗi biến có thể lấy một trong tối đa 10 giá trị.

Tôi có lưu trữ tất cả các nút trong DAG không và cho mỗi nút lưu trữ Bảng xác suất có điều kiện (CPT) của nó? Có cấu trúc dữ liệu nào khác mà tôi nên sử dụng để đảm bảo tính toán hiệu quả các giá trị khi một số CPT thay đổi (ngoài các cấu trúc được sử dụng bởi DAG) không?


Tôi đang sử dụng trong cơ sở dữ liệu sqlite bộ nhớ để lưu trữ các bảng CP, vì DB dự kiến ​​sẽ có các thuật toán và cấu trúc dữ liệu hiệu quả để xử lý các bảng. Hoạt động tốt! :)
Pratik Deoghare

Vui lòng xác định những gì bạn có nghĩa là hiệu quả (bộ nhớ, hiệu suất, vv) và bao gồm các ràng buộc của bạn. Không có những thứ này, điều này có thể dễ dàng kết thúc một cuộc thi cho hiệu quả nhất sẽ làm suy giảm mã mật mã mà tôi không bao giờ muốn phải giải quyết trong công việc hàng ngày.
Justin Bozonier

1
@JustinBozonier đòi hỏi ít bộ nhớ hơn và có nhanh không?
Pratik Deoghare

Câu trả lời:


12

Cấu trúc dữ liệu "tốt nhất" có thể phụ thuộc vào vấn đề cụ thể mà bạn đang cố gắng giải quyết với nó. Đây là một cách tiếp cận mà tôi đã thấy (và đã sử dụng bản thân mình), đơn giản là lưu trữ tất cả thông tin và để lại thuật toán phải làm gì với nó.

  1. Trước tiên, bạn lập chỉ mục các nút theo số nguyên duy nhất, từ 0 đến n-1. Sau đó, bạn chỉ cần lưu trữ, đối với mỗi nút, danh sách cha mẹ của nó là một mảng các số nguyên --- trong C ++, ví dụ, bạn có thể có std::vector<std::vector<int> >: vectơ đầu tiên trên các nút, vectơ thứ hai liệt kê các cha mẹ tương ứng). Điều đó nắm bắt toàn bộ cấu trúc DAG.

  2. Hơn nữa, vì mỗi nút có chính xác một bảng xác suất có điều kiện được liên kết với nó, bạn có thể lập chỉ mục cho các nút có cùng số nguyên ID. Đối với mỗi bảng xác suất, bạn cần lưu trữ phạm vi của nó, tức là tập hợp các biến ngẫu nhiên được xác định. Thứ hai, bạn có thể có một danh sách lớn các số dấu phẩy động chứa xác suất có điều kiện thực tế (và bạn sẽ muốn đảm bảo rằng bạn đã lập chỉ mục đúng). Để đưa ra một ví dụ C ++ một lần nữa, một cái gì đó như thế này có thể làm:

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

    Cùng với đó, bạn có thể sử dụng một std::vector<CondProbTable>để lưu trữ tất cả CPT của mình.

Một lần nữa, điều này về cơ bản chỉ lưu trữ mạng Bayes, nó không giả định bất cứ điều gì về những gì bạn muốn làm với nó. Việc bao gồm phạm vi CPT trong CondProbTable là hơi dư thừa, vì nó có thể được suy ra từ danh sách các nút cha được mô tả theo điểm 1.


0

Về cơ bản CPT rời rạc là hypermatrixes, và bạn nên nhìn chúng theo cách này.

Một cách khá phổ biến để biểu diễn một hypermatrix là sử dụng hàm băm bằng chỉ mục chuỗi. ví dụ: trong 2 chiều t [1] [2] sẽ là t.get ("1_2")

Có thể có nhiều giải pháp hiệu quả bộ nhớ hơn: Nếu hypermatrix thưa thớt, bạn có thể sử dụng biểu diễn thưa đặc biệt (ví dụ Fuchs 72), nếu nó có cấu trúc, bạn có thể sử dụng ADD (sơ đồ quyết định algrebraic) hoặc quy tắc dựa trên logic.

Câu hỏi cuối cùng của bạn không rõ ràng lắm, tuy nhiên nếu bạn mong muốn CPT của mình thay đổi thường xuyên, có lẽ bạn sẽ tốt hơn với một đại diện phẳng của CPT bằng bảng hoặc hàm băm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.