Matlab

2012-12-04 10 views
6

में कॉवरिएन्स मैट्रिक्स की गणना करना मैं MATLAB में एक पीसीए एल्गोरिदम लागू कर रहा हूं।Matlab

C = sampleMat.' * sampleMat ./ nSamples; 

और

C = cov(data); 

इन दोनों तरीकों में क्या अंतर है: मैं सहप्रसरण मैट्रिक्स की गणना करने के लिए दो अलग-अलग दृष्टिकोण देखते हैं?

पी एस 1:

meanSample = mean(data,1); 
data = data - repmat(data, nSamples, 1); 

पी एस 2:

पहले दृष्टिकोण में मैं nSamples या nSamples - 1 का उपयोग करना चाहिए जब मैं cov(data) का उपयोग अनावश्यक है?

उत्तर

10

संक्षेप में: cov मुख्य रूप से केवल नंगे फॉर्मूला में सुविधा जोड़ता है।

आप लिखते हैं, तो

edit cov 

आप तल पर सभी तरह इन पंक्तियों के साथ सामान का एक बहुत देखेंगे,:

xc = bsxfun(@minus,x,sum(x,1)/m); % Remove mean  
if flag 
    xy = (xc' * xc)/m; 
else 
    xy = (xc' * xc)/(m-1); % DEFAULT 
end 

जो अनिवार्य रूप से अपने पहली पंक्ति के रूप में ही है, कॉलम-साधनों के घटाव के लिए सहेजें।

नमूना कॉन्वर्सिस पर the wiki पढ़ें, यह देखने के लिए कि डिफ़ॉल्ट पथ में कोई ऋण-शून्य क्यों है।

ध्यान दें कि आपकी पहली पंक्ति सामान्य ट्रांज़ेप (.') का उपयोग करती है, जबकि cov -वर्जन conjugate-transpose (') का उपयोग करता है। यह जटिल मूल्यवान डेटा के संदर्भ में cov का उत्पादन अलग करेगा।

यह भी ध्यान दें कि cov एक गैर-निर्मित फ़ंक्शन के लिए फ़ंक्शन कॉल है। इसका मतलब है कि एक लूप में cov का उपयोग करते समय एक (संभावित रूप से गंभीर) प्रदर्शन दंड होगा; मैटलैब का जेआईटी कंपाइलर गैर-निर्मित कार्यों में तेजी नहीं कर सकता है।

+0

चेतावनी के साथ कि जटिल संख्याओं को प्रश्न में कोड से अलग तरीके से संभाला जाता है। –

+0

@BenVoigt: सच है, ट्रांसपोज़ अलग है, धन्यवाद। संपादन ... –

+0

आपके संपादन 2 के अनुसार, क्या पहली पंक्ति का उपयोग करना बेहतर है? और कौन सा सही है या वे conjugate-transpose का उपयोग करने के लिए समान हैं और covariance की गणना करने के लिए transpos? – kamaci