आप जो कर रहे हैं वह गलत है: पीसीए के लिए PRESS की गणना करने का कोई मतलब नहीं है! विशेष रूप से, समस्या आपके चरण # 5 में है।
पीसीए के लिए प्रेस करने के लिए Nave दृष्टिकोण
बता दें कि डेटा सेट में डायमेंशनल स्पेस में पॉइंट्स होते हैं: । एक एकल परीक्षण डेटा बिंदु लिए पुनर्निर्माण त्रुटि की गणना करने के लिए , आप प्रशिक्षण सेट पर पीसीए प्रदर्शन करते हैं, इस बिंदु को छोड़कर, प्रमुख अक्षों की एक निश्चित संख्या । कॉलम के रूप में , और पुनर्निर्माण त्रुटि को रूप में ढूंढें । PRESS तो सभी परीक्षण नमूनों पर योग के बराबर हैघ एक्स ( मैं ) ∈ आर डी ,ndx(i)∈Rd,i=1…nx(i)X(−i)kU(−i) मैं पी∥∥x(i)−x^(i)∥∥2=∥∥x(i)−U(−i)[U(−i)]⊤x(i)∥∥2i, इसलिए उचित समीकरण प्रतीत होता है:
PRESS=?∑i=1n∥∥x(i)−U(−i)[U(−i)]⊤x(i)∥∥2.
सादगी के लिए, मैं यहां केंद्रित और स्केलिंग के मुद्दों की अनदेखी कर रहा हूं।
भोला दृष्टिकोण गलत है
उपरोक्त समस्या यह है कि हम भविष्यवाणी गणना करने के लिए का उपयोग करते हैं , और यह एक बहुत खराब बात है।x(i)x^(i)
एक प्रतिगमन मामले के लिए महत्वपूर्ण अंतर पर ध्यान दें, जहां पुनर्निर्माण त्रुटि के लिए सूत्र मूल रूप से एक ही , लेकिन भविष्यवाणियों की भविष्यवाणी पूर्वसूचक चर का उपयोग करके की जाती है और का उपयोग नहीं किया जाता है । पीसीए में यह संभव नहीं है, क्योंकि पीसीए में कोई निर्भर और स्वतंत्र चर नहीं हैं: सभी चर एक साथ व्यवहार किए जाते हैं।∥∥y(i)−y^(i)∥∥2y^(i)y(i)
व्यवहार में यह है कि प्रेस के रूप में ऊपर की गणना की घटकों की संख्या में वृद्धि के साथ कम कर सकते हैं इसका मतलब और एक न्यूनतम तक पहुँचने कभी नहीं। कौन सा नेतृत्व करेंगे लगता है कि सब घटकों महत्वपूर्ण हैं। या हो सकता है कि कुछ मामलों में यह एक न्यूनतम तक पहुँच जाता है, लेकिन फिर भी इष्टतम आयाम को ओवरफिट और overestimate करता है।kd
एक सही तरीका
कई संभावित दृष्टिकोण हैं, ब्रो एट अल देखें । (2008) घटक मॉडल का क्रॉस-सत्यापन: अवलोकन और तुलना के लिए वर्तमान तरीकों पर एक महत्वपूर्ण नज़र । एक दृष्टिकोण एक समय में एक डेटा बिंदु के एक आयाम को छोड़ना है (यानी बजाय ), ताकि प्रशिक्षण डेटा एक लापता मान के साथ एक मैट्रिक्स बन जाए। , और फिर पीसीए के साथ इस लापता मूल्य की भविष्यवाणी करने के लिए ("थोपना")। (एक निश्चित रूप से मैट्रिक्स तत्वों के कुछ बड़े अंश, जैसे 10%) को बेतरतीब ढंग से पकड़ सकता है। समस्या यह है कि लापता मूल्यों के साथ पीसीए की गणना कम्प्यूटेशनल रूप से काफी धीमी गति से हो सकती है (यह ईएम एल्गोरिदम पर निर्भर करता है), लेकिन यहां कई बार पुनरावृत्त होने की आवश्यकता होती है। अपडेट: देखें http://alexhwilliams.info/itsneuronalblog/2018/02/26/crossval/x(i)jx(i) एक अच्छी चर्चा और पायथन कार्यान्वयन के लिए (लापता मूल्यों वाले पीसीए को कम से कम वर्गों के माध्यम से लागू किया जाता है)।
एक दृष्टिकोण जो मुझे बहुत अधिक व्यावहारिक लगा, वह यह है कि एक समय में एक डेटा बिंदु को छोड़ दें , प्रशिक्षण डेटा पर पीसीए की गणना करें (बिल्कुल ऊपर), लेकिन फिर आयामों पर लूप करें , उन्हें एक बार में बाहर छोड़ दें और बाकी का उपयोग करके एक पुनर्निर्माण त्रुटि की गणना करें। यह शुरुआत में काफी भ्रामक हो सकता है और सूत्र काफी गड़बड़ हो जाते हैं, लेकिन कार्यान्वयन सीधा है। मुझे पहले (कुछ डरावना) सूत्र दें, और फिर इसे संक्षेप में बताएं:x(i)x(i)
PRESSPCA=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]+x(i)−j]j∣∣∣2.
यहां आंतरिक लूप पर विचार करें। हम एक बिंदु बाहर छोड़ दिया और अभिकलन प्रशिक्षण डेटा पर प्रिंसिपल घटकों, । अब हम परीक्षण के रूप में प्रत्येक मान रखते हैं और भविष्यवाणी करने के लिए शेष आयामों का उपयोग करते हैं। । भविष्यवाणी है वें "प्रक्षेपण" (कम से कम वर्गों अर्थ में) के समन्वय की उपस्पेस पर फैला by । इसकी गणना करने के लिए, PC स्थान निकटतम बिंदु को ढूंढें जो इसके निकटतम हैx(i)kU(−i)x(i)jx(i)−j∈Rd−1x^(i)jjx(i)−jU(−i)z^Rkx(i)−j की गणना करके जहां है के साथ वें पंक्ति बाहर निकाल दिया गया, और अर्थ है छद्म सूचक। अब मानचित्र मूल स्थान पर वापस जाएं: और इसके निर्देशांक । z^=[U(−i)−j]+x(i)−j∈RkU(−i)−jU(−i)j[⋅]+z^U(−i)[U(−i)−j]+x(i)−jj[⋅]j
सही दृष्टिकोण के लिए एक अनुमान
मैं PLS_Toolbox में उपयोग किए जाने वाले अतिरिक्त सामान्यीकरण को काफी नहीं समझता, लेकिन यहाँ एक दृष्टिकोण है जो उसी दिशा में जाता है।
मुख्य घटकों के स्थान पर को मैप करने का एक और तरीका है : , यानी केवल छद्म-उलटा के बजाय स्थानान्तरण लें। दूसरे शब्दों में, परीक्षण के लिए छोड़ दिया गया आयाम बिल्कुल भी नहीं गिना जाता है, और संबंधित भार भी केवल बाहर निकाल दिए जाते हैं। मुझे लगता है कि यह कम सटीक होना चाहिए, लेकिन अक्सर स्वीकार्य हो सकता है। अच्छी बात यह है कि परिणामी सूत्र अब निम्नानुसार वेक्टरकृत किया जा सकता है (मैं गणना छोड़ देता हूं):x(i)−jz^approx=[U(−i)−j]⊤x(i)−j
PRESSPCA,approx=∑i=1n∑j=1d∣∣∣x(i)j−[U(−i)[U(−i)−j]⊤x(i)−j]j∣∣∣2=∑i=1n∥∥(I−UU⊤+diag{UU⊤})x(i)∥∥2,
जहाँ मैंने कॉम्पैक्ट के लिए as लिखा है , और अर्थ है सभी गैर-विकर्ण तत्वों को शून्य पर सेट करना। ध्यान दें कि यह सूत्र बिल्कुल छोटे सुधार के साथ पहले वाले (भोले प्रेस) की तरह दिखता है! यह भी ध्यान दें कि यह सुधार PLS_Toolbox कोड की तरह केवल के विकर्ण पर निर्भर करता है । हालाँकि, सूत्र अभी भी PLS_Toolbox में लागू होने वाले कार्यों से भिन्न है, और यह अंतर मैं समझा नहीं सकता। यू डी मैं एक छ {⋅} यू यू ⊤U(−i)Udiag{⋅}UU⊤
अद्यतन (फरवरी 2018): ऊपर मैंने एक प्रक्रिया को "सही" और दूसरे को "अनुमानित" कहा, लेकिन मुझे अब इतना यकीन नहीं है कि यह सार्थक है। दोनों प्रक्रियाएं समझ में आती हैं और मुझे लगता है कि न तो अधिक सही है। मुझे वास्तव में पसंद है कि "अनुमानित" प्रक्रिया का एक सरल सूत्र है। इसके अलावा, मुझे याद है कि मेरे पास कुछ डेटासेट थे जहां "अनुमानित" प्रक्रिया के परिणाम मिले, जो अधिक सार्थक दिखे। दुर्भाग्य से, मुझे अब विवरण याद नहीं है।
उदाहरण
यहाँ बताया गया है कि ये तरीके दो जाने-माने डेटासेट्स के लिए कैसे तुलना करते हैं: आइरिस डेटासेट और वाइन डेटासेट। ध्यान दें कि भोली विधि एक कम होने वाली वक्र का उत्पादन करती है, जबकि अन्य दो विधियां न्यूनतम के साथ वक्र उत्पन्न करती हैं। आगे ध्यान दें कि आईरिस मामले में, अनुमानित विधि 1 पीसी को इष्टतम संख्या के रूप में बताती है लेकिन छद्म बिंदु विधि 2 अंक का सुझाव देती है। (और आइरिस डाटासेट के लिए किसी भी पीसीए स्कैल्पलॉट को देखते हुए, ऐसा लगता है कि दोनों पहले पीसी कुछ संकेत ले जाते हैं।) और शराब के मामले में छद्म बिंदु 3 विधि स्पष्ट रूप से 3 पीसी पर इंगित करता है, जबकि अनुमानित विधि 3 और 5 के बीच नहीं हो सकती है।
क्रॉस-सत्यापन करने और परिणामों की साजिश करने के लिए मतलाब कोड
function pca_loocv(X)
%// loop over data points
for n=1:size(X,1)
Xtrain = X([1:n-1 n+1:end],:);
mu = mean(Xtrain);
Xtrain = bsxfun(@minus, Xtrain, mu);
[~,~,V] = svd(Xtrain, 'econ');
Xtest = X(n,:);
Xtest = bsxfun(@minus, Xtest, mu);
%// loop over the number of PCs
for j=1:min(size(V,2),25)
P = V(:,1:j)*V(:,1:j)'; %//'
err1 = Xtest * (eye(size(P)) - P);
err2 = Xtest * (eye(size(P)) - P + diag(diag(P)));
for k=1:size(Xtest,2)
proj = Xtest(:,[1:k-1 k+1:end])*pinv(V([1:k-1 k+1:end],1:j))'*V(:,1:j)';
err3(k) = Xtest(k) - proj(k);
end
error1(n,j) = sum(err1(:).^2);
error2(n,j) = sum(err2(:).^2);
error3(n,j) = sum(err3(:).^2);
end
end
error1 = sum(error1);
error2 = sum(error2);
error3 = sum(error3);
%// plotting code
figure
hold on
plot(error1, 'k.--')
plot(error2, 'r.-')
plot(error3, 'b.-')
legend({'Naive method', 'Approximate method', 'Pseudoinverse method'}, ...
'Location', 'NorthWest')
legend boxoff
set(gca, 'XTick', 1:length(error1))
set(gca, 'YTick', [])
xlabel('Number of PCs')
ylabel('Cross-validation error')
tempRepmat(kk,kk) = -1
लाइन की भूमिका क्या है ? क्या पिछली पंक्ति पहले से ही सुनिश्चित नहीं है किtempRepmat(kk,kk)
-1 के बराबर है? इसके अलावा, क्यों minuses? त्रुटि वैसे भी चुकता होने वाली है, इसलिए मैं सही ढंग से समझता हूं कि यदि मीनू को हटा दिया जाता है, तो कुछ भी नहीं बदलेगा?