मुख्य घटकों की संख्या निर्धारित करने के लिए पीसीए के लिए क्रॉस-सत्यापन कैसे करें?


12

मैं प्रिंसिपल कंपोनेंट एनालिसिस के लिए अपना खुद का फंक्शन लिखने की कोशिश कर रहा हूँ, PCA (बेशक इसमें पहले से ही बहुत कुछ लिखा है लेकिन मैं सिर्फ अपने आप से सामान को लागू करने में दिलचस्पी रखता हूँ)। मैंने जो मुख्य समस्या का सामना किया है, वह क्रॉस-वैलिडेशन चरण है और वर्गों (PRESS) की अनुमानित राशि की गणना है। इससे कोई फर्क नहीं पड़ता कि मैं किस क्रॉस-वैलिडेशन का उपयोग करता हूं, यह मुख्य रूप से पीछे के सिद्धांत के बारे में एक सवाल है, लेकिन लीव-वन-आउट क्रॉस-वैलिडेशन (एलओओसीवी) पर विचार करें। सिद्धांत से मुझे पता चला कि LOOCV करने के लिए आपको निम्न की आवश्यकता है:

  1. किसी वस्तु को हटाना
  2. बाकी को पैमाना
  3. कुछ घटकों के साथ पीसीए प्रदर्शन करें
  4. (2) में प्राप्त मापदंडों के अनुसार हटाई गई वस्तु को मापें
  5. पीसीए मॉडल के अनुसार वस्तु की भविष्यवाणी करें
  6. इस ऑब्जेक्ट के लिए PRESS की गणना करें
  7. अन्य वस्तुओं के समान एल्गोरिथ्म को फिर से निष्पादित करें
  8. सभी मूल्य मूल्यों को योग करें
  9. फायदा

क्योंकि मैं क्षेत्र में बहुत नया हूं, यह सुनिश्चित करने के लिए कि मैं सही हूं, मैं कुछ सॉफ्टवेयर से आउटपुट के साथ परिणामों की तुलना करता हूं (कुछ कोड लिखने के लिए भी मैं सॉफ्टवेयर में निर्देशों का पालन करता हूं)। मुझे वर्गों और के अवशिष्ट योग की गणना करने के लिए पूरी तरह से समान परिणाम मिलते हैं , लेकिन PRESS की गणना एक समस्या है।R2

क्या आप मुझे बता सकते हैं कि क्या मैं क्रॉस-वैरिफिकेशन स्टेप में लागू करता हूं या नहीं:

case 'loocv'

% # n - number of objects
% # p - number of variables
% # vComponents - the number of components used in CV
dataSets = divideData(n,n); 
         % # it is just a variable responsible for creating datasets for CV 
         % #  (for LOOCV datasets will be equal to [1, 2, 3, ... , n]);'
tempPRESS = zeros(n,vComponents);

for j = 1:n
  Xmodel1 = X; % # X - n x p original matrix
  Xmodel1(dataSets{j},:) = []; % # delete the object to be predicted
  [Xmodel1,Xmodel1shift,Xmodel1div] = skScale(Xmodel1, 'Center', vCenter, 
                                              'Scaling', vScaling); 
          % # scale the data and extract the shift and scaling factor
  Xmodel2 = X(dataSets{j},:); % # the object to be predicted
  Xmodel2 = bsxfun(@minus,Xmodel2,Xmodel1shift); % # shift and scale the object
  Xmodel2 = bsxfun(@rdivide,Xmodel2,Xmodel1div);
  [Xscores2,Xloadings2] = myNipals(Xmodel1,0.00000001,vComponents); 
          % # the way to calculate the scores and loadings
                % # Xscores2 - n x vComponents matrix
                % # Xloadings2 - vComponents x p matrix
  for i = 1:vComponents
    tempPRESS(j,i) = sum(sum((Xmodel2* ...
       (eye(p) - transpose(Xloadings2(1:i,:))*Xloadings2(1:i,:))).^2));
  end
end
PRESS = sum(tempPRESS,1);

सॉफ्टवेयर ( PLS_Toolbox ) में यह इस तरह काम करता है:

for i = 1:vComponents
    tempPCA = eye(p) - transpose(Xloadings2(1:i,:))*Xloadings2(1:i,:);
    for kk = 1:p
        tempRepmat(:,kk) = -(1/tempPCA(kk,kk))*tempPCA(:,kk);
          % # this I do not understand
        tempRepmat(kk,kk) = -1; 
          % # here is some normalization that I do not get
    end 
    tempPRESS(j,i) = sum(sum((Xmodel2*tempRepmat).^2)); 
end

इसलिए, वे इस tempRepmatचर का उपयोग करते हुए कुछ अतिरिक्त सामान्यीकरण करते हैं : एकमात्र कारण मैंने पाया कि वे मजबूत पीसीए के लिए एलओओसीवी लागू करते हैं। दुर्भाग्य से, समर्थन टीम मेरे प्रश्न का उत्तर नहीं देना चाहती थी क्योंकि मेरे पास उनके सॉफ़्टवेयर का केवल डेमो संस्करण है।


आगे की जाँच अगर मैं अतिरिक्त सामान्यीकरण स्निपेट को समझता हूं: tempRepmat(kk,kk) = -1लाइन की भूमिका क्या है ? क्या पिछली पंक्ति पहले से ही सुनिश्चित नहीं है कि tempRepmat(kk,kk)-1 के बराबर है? इसके अलावा, क्यों minuses? त्रुटि वैसे भी चुकता होने वाली है, इसलिए मैं सही ढंग से समझता हूं कि यदि मीनू को हटा दिया जाता है, तो कुछ भी नहीं बदलेगा?
अमीबा

मैं इसे अतीत में जाँच रहा था और कुछ भी नहीं बदलेगा। यह सही है। मुझे मजबूत पीसीए कार्यान्वयन के साथ केवल कुछ समानताएं मिलीं क्योंकि इस तरह के कार्यान्वयन में प्रत्येक गणना मूल्य (सब कुछ समेटने से पहले) का अपना वजन होता है।
किरील

मैं जवाब में उपलब्ध MATLAB कोड के बराबर आर कोड की तलाश कर रहा हूं और एक इनाम रखा है।
AIM_BLB

3
@CSA, कोड के लिए पूछना विषय से दूर है (यहां तक ​​कि, संभवतः, टिप्पणियों और मुकाबलों के माध्यम से)। आपको स्टैक ओवरफ्लो पर यह पूछने में सक्षम होना चाहिए : आप कोड को कॉपी कर सकते हैं, स्रोत w / एक लिंक का हवाला देते हैं, और अनुवाद के लिए पूछ सकते हैं। मेरा मानना ​​है कि यह सब वहाँ विषय पर होगा।
गूँग - मोनिका

जवाबों:


21

आप जो कर रहे हैं वह गलत है: पीसीए के लिए PRESS की गणना करने का कोई मतलब नहीं है! विशेष रूप से, समस्या आपके चरण # 5 में है।


पीसीए के लिए प्रेस करने के लिए Nave दृष्टिकोण

बता दें कि डेटा सेट में डायमेंशनल स्पेस में पॉइंट्स होते हैं: । एक एकल परीक्षण डेटा बिंदु लिए पुनर्निर्माण त्रुटि की गणना करने के लिए , आप प्रशिक्षण सेट पर पीसीए प्रदर्शन करते हैं, इस बिंदु को छोड़कर, प्रमुख अक्षों की एक निश्चित संख्या । कॉलम के रूप में , और पुनर्निर्माण त्रुटि को रूप में ढूंढें । PRESS तो सभी परीक्षण नमूनों पर योग के बराबर हैएक्स ( मैं )आर डी ,ndx(i)Rd,i=1nx(i)X(i)kU(i) मैं पीx(i)x^(i)2=x(i)U(i)[U(i)]x(i)2i, इसलिए उचित समीकरण प्रतीत होता है:

PRESS=?i=1nx(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/xj(i)x(i) एक अच्छी चर्चा और पायथन कार्यान्वयन के लिए (लापता मूल्यों वाले पीसीए को कम से कम वर्गों के माध्यम से लागू किया जाता है)।

एक दृष्टिकोण जो मुझे बहुत अधिक व्यावहारिक लगा, वह यह है कि एक समय में एक डेटा बिंदु को छोड़ दें , प्रशिक्षण डेटा पर पीसीए की गणना करें (बिल्कुल ऊपर), लेकिन फिर आयामों पर लूप करें , उन्हें एक बार में बाहर छोड़ दें और बाकी का उपयोग करके एक पुनर्निर्माण त्रुटि की गणना करें। यह शुरुआत में काफी भ्रामक हो सकता है और सूत्र काफी गड़बड़ हो जाते हैं, लेकिन कार्यान्वयन सीधा है। मुझे पहले (कुछ डरावना) सूत्र दें, और फिर इसे संक्षेप में बताएं:x(i)x(i)

PRESSPCA=i=1nj=1d|xj(i)[U(i)[Uj(i)]+xj(i)]j|2.

यहां आंतरिक लूप पर विचार करें। हम एक बिंदु बाहर छोड़ दिया और अभिकलन प्रशिक्षण डेटा पर प्रिंसिपल घटकों, । अब हम परीक्षण के रूप में प्रत्येक मान रखते हैं और भविष्यवाणी करने के लिए शेष आयामों का उपयोग करते हैं। । भविष्यवाणी है वें "प्रक्षेपण" (कम से कम वर्गों अर्थ में) के समन्वय की उपस्पेस पर फैला by । इसकी गणना करने के लिए, PC स्थान निकटतम बिंदु को ढूंढें जो इसके निकटतम हैx(i)kU(i)xj(i)xj(i)Rd1x^j(i)jxj(i)U(i)z^Rkxj(i) की गणना करके जहां है के साथ वें पंक्ति बाहर निकाल दिया गया, और अर्थ है छद्म सूचक। अब मानचित्र मूल स्थान पर वापस जाएं: और इसके निर्देशांक । z^=[Uj(i)]+xj(i)RkUj(i)U(i)j[]+z^U(i)[Uj(i)]+xj(i)j[]j

सही दृष्टिकोण के लिए एक अनुमान

मैं PLS_Toolbox में उपयोग किए जाने वाले अतिरिक्त सामान्यीकरण को काफी नहीं समझता, लेकिन यहाँ एक दृष्टिकोण है जो उसी दिशा में जाता है।

मुख्य घटकों के स्थान पर को मैप करने का एक और तरीका है : , यानी केवल छद्म-उलटा के बजाय स्थानान्तरण लें। दूसरे शब्दों में, परीक्षण के लिए छोड़ दिया गया आयाम बिल्कुल भी नहीं गिना जाता है, और संबंधित भार भी केवल बाहर निकाल दिए जाते हैं। मुझे लगता है कि यह कम सटीक होना चाहिए, लेकिन अक्सर स्वीकार्य हो सकता है। अच्छी बात यह है कि परिणामी सूत्र अब निम्नानुसार वेक्टरकृत किया जा सकता है (मैं गणना छोड़ देता हूं):xj(i)z^approx=[Uj(i)]xj(i)

PRESSPCA,approx=i=1nj=1d|xj(i)[U(i)[Uj(i)]xj(i)]j|2=i=1n(IUU+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')

आपके उत्तर के लिए धन्यवाद! मुझे वह कागज पता है। और मैंने वहां वर्णित पंक्ति-वार क्रॉस-सत्यापन लागू किया (लगता है कि यह मेरे द्वारा प्रदान किए गए कोड से बिल्कुल मेल खाता है)। मैं PLS_Toolbox सॉफ्टवेयर से तुलना करता हूं, लेकिन उनके पास LOOCV में कोड की एक पंक्ति है जो मुझे वास्तव में समझ में नहीं आती है (मैंने मूल प्रश्न में लिखा है)।
किरिल

हां, वे इसे "पंक्ति-वार क्रॉस-वैलिडेशन" कहते हैं और आपका कार्यान्वयन ठीक लगता है, लेकिन कृपया ध्यान दें कि यह क्रॉस-वैलिडेशन करने के लिए एक बुरा तरीका है (जैसा कि कहा गया है और ब्रो एट अल में अनुभवजन्य रूप से प्रदर्शित किया गया है।) और मूल रूप से आपको चाहिए। इसका इस्तेमाल कभी न करें! कोड की लाइन के बारे में आप समझ नहीं पा रहे हैं - क्या आप अपना प्रश्न अपडेट करने जा रहे हैं? निश्चित नहीं है कि आप किसका जिक्र कर रहे हैं।
अमीबा

बात यह है कि इस कार्यान्वयन में सीवी में न्यूनतम तक पहुंचने की क्षमता है।
किरिल

PRESS of LOO% के बहुत करीब है विचरण समझाया - मैं यह नहीं कहूंगा कि यह अच्छा है या बुरा, लेकिन यह निश्चित रूप से कुछ के बारे में पता होना चाहिए। और जैसे% समझाया गया विचरण 1 आ जाएगा, जैसा कि पीसीए मॉडल डेटा सेट की रैंक के करीब पहुंचता है, यह एक्स x^x
प्रेसेंस

@Kirill: धन्यवाद, कोड स्निपेट अब समझ में आता है (शायद आप उपरोक्त टिप्पणियों को हटा सकते हैं जो अब अप्रचलित हैं)। मुझे नहीं पता कि यह क्या करना चाहिए था, लेकिन अगर आप कहते हैं कि यह गणना की गई त्रुटि को न्यूनतम तक पहुंचाता है, तो संभवत: यह प्रभावी रूप से बड़ी ( कुछ घटकों की संख्या; यानी आपके कोड में परिवर्तनशील ) के लिए कुछ दंड दे रहा है । ईमानदारी से, मुझे ऐसी किसी भी विधि पर संदेह होगा (जब तक कि इसके लिए कोई सैद्धांतिक औचित्य नहीं है), विशेष रूप से यह देखते हुए कि मेरे उत्तर में वर्णित के रूप में बेहतर दृष्टिकोण हैं। ki
अमीबा

1

@ अमीबा के अच्छे जवाब के लिए एक और भी सामान्य बिंदु जोड़ने के लिए:

पर्यवेक्षित और असुरक्षित मॉडल के बीच एक व्यावहारिक और महत्वपूर्ण अंतर यह है कि अनचाहे मॉडल के लिए आपको बहुत कठिन सोचने की जरूरत है कि आप समकक्ष और क्या नहीं पर विचार करेंगे।

पर्यवेक्षित मॉडल हमेशा अपने अंतिम उत्पादन परिभाषा और निर्माण द्वारा,: एक तरह से जहाँ आप इस बारे में ज्यादा परवाह करने की जरूरत नहीं में के रूप में एक ही अर्थ है करने के लिए दावा है है, तो आप इसे सीधे तुलना कर सकते हैं। y yy^y^y

सार्थक प्रदर्शन उपायों का निर्माण करने के लिए, आपको यह सोचने की आवश्यकता है कि आपके आवेदन के लिए मॉडल की किस प्रकार की स्वतंत्रता बेकार है और जो नहीं हैं। यह स्कोर पर एक PRESS का कारण बनेगा, संभवतः (आमतौर पर?) किसी तरह के प्रोक्रेसी जैसे रोटेशन / फ़्लिपिंग के बाद।

PR on x मेरा अनुमान है (मेरे पास अब यह जानने का समय नहीं है कि कोड की उनकी 2 पंक्तियाँ क्या करती हैं - लेकिन शायद आप लाइनों के माध्यम से कदम रख सकते हैं और एक नज़र रख सकते हैं?)

एक उपाय प्राप्त करने के लिए, जो एक माप से एक अच्छा मॉडल जटिलता निर्धारित करने के लिए उपयोगी है जो फिट की एक अच्छाई देता है जो आम तौर पर पूर्ण रैंक मॉडल तक पहुंचने तक बढ़ेगा, आपको बहुत जटिल मॉडल के लिए दंडित करने की आवश्यकता है। जो बदले में इसका अर्थ है कि यह दंड एक महत्वपूर्ण है और ख) दंड को समायोजित करने से चुनी हुई जटिलता समायोजित हो जाएगी।


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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.