2011-08-25 9 views
8

में 2 आयामों के लिए एक बहुविकल्पीय गाऊशियन संभावना घनत्व समारोह को कार्यान्वित करना मैं सी ++ में एक बहुविकल्पीय गॉसियन की संभाव्यता घनत्व समारोह को लागू करने पर काम कर रहा हूं, और मैं आयाम> 2 के मामलों को सर्वोत्तम तरीके से कैसे संभालना है, इस पर अटक गया हूं।सी ++

एक गाऊसी की पीडीएफ

multivariate gaussian pdf

जहां (ए) 'या' 'मैट्रिक्स' एक्स के सभी तत्वों से मतलब घटाकर द्वारा बनाई गई की पक्षांतरित का प्रतिनिधित्व करता है के रूप में लिखा जा सकता है। इस समीकरण में, के हमारे आयामों की संख्या है, और सिग्मा कॉन्वर्सिस मैट्रिक्स का प्रतिनिधित्व करता है, जो एक के एक्स के मैट्रिक्स है। अंत में, | एक्स | का अर्थ है मैट्रिक्स एक्स

अनौपचारिक मामले में, पीडीएफ लागू करना मामूली है। यहां तक ​​कि बिवारिएट (के = 2) मामले में, यह मामूली है। हालांकि, जब हम दो आयामों से आगे जाते हैं, तो कार्यान्वयन बहुत कठिन होता है।

द्विचर मामले में, हम होगा

bivariate gaussian pdf

जहां रो

correlation between two random variables X and Y

के x और y के बीच संबंध है, सहसंबंध बराबर के साथ इस मामले में, मैं पहले समीकरण को लागू करने के लिए Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> का उपयोग कर सकते हैं, या केवल ईजिन के सरलीकृत रैखिक बीजगणित इंटरफ़ेस से लाभान्वित किए बिना, दूसरी समीकरण का उपयोग करके स्वयं सब कुछ की गणना कर सकते हैं।

मल्टीवेरिएट मामले पर एक प्रयास शायद

multivariate pdf

मेरे सवालों के साथ मल्टीवेरिएट मामले

multivariate pdf

को उपरोक्त समीकरणों का विस्तार करके शुरू होगा के लिए मेरे विचार कर रहे हैं:

  1. एन-आयामी सरणी के लिए boost::multi_array का उपयोग करने के लिए उचित/सलाह दी जाएगी, या क्या मुझे इसके बजाय ईजिन का लाभ उठाने का प्रयास करना चाहिए?
  2. क्या मेरे पास univariate/bivariate मामलों, के लिए अलग-अलग फ़ंक्शन होना चाहिए या क्या मुझे बूस्ट :: multi_array (या उपयुक्त विकल्प) का उपयोग करके इसे बहुविकल्पीय मामले में समझा जाना चाहिए?
+0

ओओफ! खैर, आपने अभी तक क्या प्रयास किया है? : डी –

+1

यहां उचित प्रतिक्रिया मैट्रिक्स संचालन का समर्थन करने वाली संख्यात्मक लाइब्रेरी का उपयोग करने के लिए है। क्या यूब्लास/लापैक इसे प्रदान नहीं करता है? किसी भी दर पर, 'multi_array' (या कुछ भी स्वयं निर्मित) का उपयोग करना शायद * अच्छा * नहीं है। –

उत्तर

1

मैं अपने तत्व यहाँ से बाहर एक छोटा सा हूँ, लेकिन कुछ विचार:

सबसे पहले, एक प्रोग्रामिंग देखने से, स्टॉक जवाब है, "प्रोफ़ाइल।" यही है, इसे पहले स्पष्ट तरीके से कोड करें। फिर ऑप्टिमाइज़ करना सार्थक है या नहीं, यह देखने के लिए अपने निष्पादन को प्रोफाइल करें। आईएमएचओ मूल गणित के करीब रखने के लिए मैट्रिक्स लाइब्रेरी का उपयोग करने के लिए शायद स्पष्ट है।

गणित दृश्य से: मैं बहुविकल्पीय मामले के लिए प्रदान किए गए सूत्र के बारे में थोड़ा संदिग्ध हूं। यह मेरे लिए सही नहीं लग रहा है। अभिव्यक्ति जेड एक वर्गबद्ध रूप होना चाहिए, और आपके जेड नहीं है। जब तक मैं कुछ याद नहीं कर रहा हूँ।

यहां एक विकल्प है जिसका आपने उल्लेख नहीं किया है, लेकिन इसका अर्थ हो सकता है। विशेष रूप से यदि आप एक ही वितरण के लिए कई बार पीडीएफ का मूल्यांकन करने जा रहे हैं। अपने वितरण के सिद्धांत घटक आधार की गणना करके शुरू करें। यही है, Σ के लिए एक eigenbasis। सिद्धांत घटक निर्देश ऑर्थोगोनल हैं। सिद्धांत घटक आधार में, क्रॉस कॉन्वर्सिस सभी 0 हैं, इसलिए पीडीएफ का एक साधारण रूप है। जब आप मूल्यांकन करना चाहते हैं, तो इनपुट घटक आधार पर इनपुट पर आधार बदलें, और फिर उस पर सरल पीडीएफ गणना करें।

विचार यह है कि आप आधार मैट्रिक्स और सिद्धांत घटकों के सामने एक बार आगे की गणना की गणना कर सकते हैं, और फिर केवल दो मैट्रिक्स गुणाओं के बजाय प्रति मूल्यांकन एक एकल मैट्रिक्स गुणा (आधार परिवर्तन) करना होगा मानक आधार पर (x-μ)' Σ (x-μ) का मूल्यांकन करें।

+0

कहां ओह मेरे प्रिय टीएक्स मार्कअप कहां है? MathOverflow इसका समर्थन करता है ... – Managu

+0

एक और तरीका रखो, वर्गबद्ध रूप '(x-μ)' Σ (x-μ) 'को विकर्ण रूप में अनुवाद करें (एक ला http://en.wikipedia.org/wiki/Quadratic_form#Real_quadratic_forms), और उचित आधार पर मूल्यांकन। – Managu

0

मैंने मूल रूप से exp लागू किया है - this question में तीन आयामी मामले के लिए समीकरण के भाग। मैंने पहली बार कंप्यूटर दृष्टि पुस्तकालय का उपयोग किया जिसे OpenCV कहा जाता है। लेकिन मैंने देखा कि सी ++ इंटरफ़ेस बहुत धीमा था। बाद में मैंने सी इंटरफेस की कोशिश की, जो थोड़ा तेज था। अंत में, मैंने लचीलापन और पठनीयता को अनदेखा करने का फैसला किया, इसलिए मैंने इसे बिना किसी पुस्तकालय के लागू किया और यह तेज़ तरीका था।

जो मैं कहने की कोशिश कर रहा हूं वह यह है: जब प्रदर्शन महत्वपूर्ण होता है, तो आपको जितना संभव हो उतना कम ओवरहेड के साथ सबसे अधिक उपयोग किए जाने वाले आयामों के लिए विशेष मामलों को लागू करने पर विचार करना चाहिए। अन्यथा गति पर रखरखाव का चयन करें।

अस्वीकरण: मुझे Eigen या boost::multi_array की गति के बारे में कुछ भी पता नहीं है (जो शायद यह प्रश्न वास्तव में लक्ष्य है?)।