ডেটা স্ট্রাকচারের কোন সংমিশ্রণটি কার্যকরভাবে বেইসিয়ান নেটওয়ার্কগুলিকে দক্ষতার সাথে সঞ্চয় করে?


22

আমি বায়েশিয়ান নেটওয়ার্কগুলির পিছনে তত্ত্বটি বুঝতে পেরেছি এবং ভাবছি যে বাস্তবে এটি তৈরি করতে এটি কী গ্রহণ করে। আসুন এই উদাহরণটির জন্য বলি, আমার কাছে 100 টি বিযুক্ত র্যান্ডম ভেরিয়েবলের একটি বয়েসিয়ান (নির্দেশিত) নেটওয়ার্ক রয়েছে; প্রতিটি ভেরিয়েবল 10 মান পর্যন্ত একটি নিতে পারে।

আমি কি সমস্ত নোড একটি ডিএজিতে সঞ্চয় করি এবং প্রতিটি নোডের জন্য এর শর্তসাপেক্ষ সম্ভাবনা সারণী (সিপিটি) সঞ্চয় করে রাখি? কিছু সিপিটি পরিবর্তিত হলে (কোনও ডিএজি দ্বারা ব্যবহৃতগুলি বাদ দিয়ে) মানগুলির দক্ষ গণনা নিশ্চিত করার জন্য আমার কি অন্যান্য ডেটা স্ট্রাকচার ব্যবহার করা উচিত?


আমি সিপি টেবিলগুলি সংরক্ষণের জন্য মেমোরি স্ক্লাইট ডাটাবেসে ব্যবহার করছি, যেহেতু ডিবিগুলির পক্ষে টেবিলগুলি মোকাবেলা করার জন্য দক্ষ অ্যালগরিদম এবং ডেটা স্ট্রাকচার রয়েছে। ঠিকভাবে কাজ করে! :)
প্রতীক দেওঘরে

দক্ষ (মেমরি, কর্মক্ষমতা ইত্যাদি) দ্বারা আপনি কী বোঝাতে চান তা নির্ধারণ করুন এবং আপনার প্রতিবন্ধকতাগুলি অন্তর্ভুক্ত করুন। এগুলি ছাড়া এটি সহজেই সবচেয়ে কার্যকরের জন্য একটি প্রতিযোগিতা শেষ করতে পারে যা ক্রিপ্টিক কোডে অবনতি ঘটায় আমি কখনই দিনের সাথে কাজ করতে চাই না।
জাস্টিন বোজনিয়ার 21'12

1
@ জাস্টিনবোজনিয়রের কম স্মৃতি দরকার এবং দ্রুত?
প্রতীক দেওঘরে

উত্তর:


12

"সেরা" ডেটা কাঠামো সম্ভবত আপনি কোন বিশেষ সমস্যার সাথে এটি সমাধান করার চেষ্টা করছেন তার উপর নির্ভর করে। এখানে একটি পন্থা যা আমি দেখেছি (এবং নিজেকে ব্যবহার করেছি), যা কেবল সমস্ত তথ্য সঞ্চিত করে এবং এটি দিয়ে কী করা যায় তা অ্যালগরিদমের কাছে ছেড়ে দেয়।

  1. প্রথমে আপনি নোডগুলি অনন্য পূর্ণসংখ্যার দ্বারা সূচক করে 0 থেকে এন -1 এর মাধ্যমে। তারপরে আপনি কেবল প্রতিটি নোডের জন্য, তার পিতামাতার তালিকা পূর্ণসংখ্যার অ্যারের হিসাবে --- সি ++ তে উদাহরণস্বরূপ, আপনার একটি থাকতে পারে std::vector<std::vector<int> >: নোডের উপরে প্রথম ভেক্টর, দ্বিতীয় ভেক্টর সংশ্লিষ্ট অভিভাবকদের তালিকাভুক্ত করে)। এটি পুরো ডিএজি কাঠামোকে ধারণ করে।

  2. তদতিরিক্ত, যেহেতু প্রতিটি নোডের সাথে এটির সাথে ঠিক একটি শর্তযুক্ত সম্ভাবনা সারণী যুক্ত থাকে, আপনি একই সংখ্যার আইডি সহ তাদের সূচক করতে পারেন। প্রতিটি সম্ভাব্য টেবিলের জন্য আপনাকে তার ব্যাপ্তি সঞ্চয় করতে হবে, অর্থাত্ এলোমেলো ভেরিয়েবলগুলির সেটটি এর সংজ্ঞায়িত করা হবে। দ্বিতীয়ত আপনার কাছে সম্ভবত ভাসমান পয়েন্ট সংখ্যার একটি বৃহত তালিকা থাকবে যাতে প্রকৃত শর্তাধীন সম্ভাবনা রয়েছে (এবং আপনি নিশ্চিত করতে চান যে আপনি সূচীটি সঠিকভাবে পেয়েছেন)। আবার একটি সি ++ উদাহরণ দেওয়ার জন্য এরকম কিছু করতে পারে:

    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>এটির সাহায্যে আপনি আপনার সমস্ত সিপিটি সঞ্চয় করতে একটি ব্যবহার করতে পারেন ।

আবার এটি মূলত কেবল বেয়েস নেটকেই সঞ্চয় করে, এটি দিয়ে আপনি কী করতে চান তা কিছুতেই ধরে নেয় না। কন্ডপ্রোবটেবলে সিপিটি স্কোপ অন্তর্ভুক্ত করা কিছুটা বাড়াবাড়ি, যেহেতু এটি পয়েন্ট 1 এর অধীনে বর্ণিত প্যারেন্ট নোডগুলির তালিকা থেকে অনুমান করা যেতে পারে।


0

মূলত বিচ্ছিন্ন সিপিটি হাইপারম্যাট্রিক্সস এবং আপনার এগুলি তাদের দিকে তাকাতে হবে।

হাইপারম্যাট্রিক্স উপস্থাপনের বেশ সাধারণ উপায় হ'ল স্ট্রিং ইনডেক্স ব্যবহার করে হ্যাশটেবল ব্যবহার করা। উদাহরণস্বরূপ 2 টি মাত্রা t [1] [2] হবে t.get ("1_2")

আরও মেমোরি দক্ষ সমাধান সম্ভব: হাইপারম্যাট্রিক্স বিস্মৃত হলে, আপনি বিশেষ স্পার উপস্থাপনা (যেমন ফুচস 72) ব্যবহার করতে পারেন, যদি এর কাঠামো থাকে তবে আপনি এডিডি (আলগ্র্যাব্রিক সিদ্ধান্ত ডায়াগ্রাম), বা যুক্তি ভিত্তিক নিয়ম ব্যবহার করতে পারেন।

আপনার শেষ প্রশ্নটি খুব পরিষ্কার নয়, তবে আপনি যদি নিজের সিপিটি প্রায়শই পরিবর্তিত হওয়ার প্রত্যাশা করেন, সম্ভবত আপনি কোনও টেবিল বা হ্যাশটেবলের সাহায্যে সিপিটির সমতল প্রতিনিধিত্ব করলে আরও ভাল হবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.