2011-05-27 18 views
6

की म्यूचुअल जानकारी मेरे पास एक वर्ग मैट्रिक्स है जो डेटा सेट में सह-घटनाओं की आवृत्ति गणना का प्रतिनिधित्व करता है। दूसरे शब्दों में, पंक्तियां फीचर 1 के सभी संभावित अवलोकनों का प्रतिनिधित्व करती हैं, और कॉलम सुविधा 2 के संभावित अवलोकन हैं। सेल (x, y) में संख्या एक बार में एक्स होने के लिए फ़ीचर 1 को देखा गया था फीचर 2 वाई था।MATLAB मैट्रिक्स

मैं इस मैट्रिक्स में निहित आपसी जानकारी की गणना करना चाहता हूं। MATLAB में अंतर्निहित information फ़ंक्शन है, लेकिन इसमें 2 तर्क होते हैं, एक x के लिए और एक y के लिए। तर्कों को प्राप्त करने के लिए मैं इस मैट्रिक्स का उपयोग कैसे करूं?

वैकल्पिक रूप से, मैंने अपना खुद का पारस्परिक सूचना फ़ंक्शन लिखा जो मैट्रिक्स लेता है, लेकिन मैं इसकी सटीकता के बारे में अनिश्चित हूं। क्या यह सही दिखता है?

function [mutualinfo] = mutualInformation(counts) 

    total = sum(counts(:)); 
    pX = sum(counts, 1) ./ total; 
    pY = sum(counts) ./ total; 
    pXY = counts ./ total; 

    [h, w] = size(counts); 

    mutualinfo = 0; 

    for row = 1:h 
    for col = 1:w 
     mutualinfo = mutualinfo + pXY(row, col) * log(pXY(row, col)/(pX(row)*pY(col))); 
    end; 
    end; 

end 

उत्तर

6

मुझे MATLAB में किसी भी अंतर्निहित आपसी जानकारी कार्यों के बारे में पता नहीं है। शायद आपको MathWorks File Exchange या कुछ other third-party developer code से सबमिशन में से एक को पकड़ लिया गया है?

मुझे लगता है कि pX और pY की गणना करने के तरीके में कुछ गड़बड़ हो सकती है। इसके अलावा, आप लूप के लिए उपयोग करने के बजाय अपने परिचालनों को सदिश बना सकते हैं। कोशिश करने के लिए अपने फ़ंक्शन का एक और संस्करण यहां दिया गया है:

function mutualInfo = mutualInformation(counts) 

    pXY = counts./sum(counts(:)); 
    pX = sum(pXY,2); 
    pY = sum(pXY,1); 

    mutualInfo = pXY.*log(pXY./(pX*pY)); 
    mutualInfo = sum(mutualInfo(:)); 

end 
+0

यह फ़ंक्शन मेरे मूल के समान मूल्यों को वापस कर रहा है, इसलिए मेरा मानना ​​है कि वे समकक्ष हैं। फिर भी, तुम्हारा और अधिक सुरुचिपूर्ण है। – Colin