Ich versuche, meine eigene Funktion für die Hauptkomponentenanalyse, PCA, zu schreiben (natürlich ist bereits viel geschrieben, aber ich bin nur daran interessiert, Dinge selbst zu implementieren). Das Hauptproblem, auf das ich gestoßen bin, ist der Kreuzvalidierungsschritt und die Berechnung der vorhergesagten Quadratsumme (PRESS). Es spielt keine Rolle, welche Kreuzvalidierung ich verwende, es geht hauptsächlich um die dahinter stehende Theorie, aber erwägen Sie eine einmalige Kreuzvalidierung (LOOCV). Aus der Theorie habe ich herausgefunden, dass Sie zur Durchführung von LOOCV Folgendes tun müssen:
- ein Objekt löschen
- skalieren Sie den Rest
- Führen Sie eine PCA mit einer bestimmten Anzahl von Komponenten durch
- Skalieren Sie das gelöschte Objekt gemäß den in (2) erhaltenen Parametern.
- Vorhersage des Objekts gemäß dem PCA-Modell
- Berechnen Sie PRESS für dieses Objekt
- Führen Sie denselben Algorithmus für andere Objekte erneut aus
- Fassen Sie alle PRESS-Werte zusammen
- profitieren
Da ich auf diesem Gebiet sehr neu bin, vergleiche ich die Ergebnisse mit der Ausgabe einer Software, die ich habe, um sicherzugehen, dass ich Recht habe (auch um Code zu schreiben, folge ich den Anweisungen in der Software). Ich erhalte die gleichen Ergebnisse bei der Berechnung der Restsumme von Quadraten und , aber die Berechnung von PRESS ist ein Problem.
Könnten Sie mir bitte sagen, ob das, was ich im Kreuzvalidierungsschritt implementiere, richtig ist oder nicht:
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);
In der Software ( PLS_Toolbox ) funktioniert das folgendermaßen:
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
Daher führen sie mit dieser tempRepmat
Variablen eine zusätzliche Normalisierung durch : Der einzige Grund, den ich gefunden habe, war, dass sie LOOCV für robuste PCA anwenden. Leider wollte das Support-Team meine Frage nicht beantworten, da ich nur eine Demoversion seiner Software habe.
tempRepmat(kk,kk) = -1
Leitung? Stellt die vorherige Zeile nicht bereits sicher, dasstempRepmat(kk,kk)
-1 gleich ist? Warum auch Minuspunkte? Der Fehler wird sowieso quadriert. Verstehe ich also richtig, dass sich nichts ändert, wenn die Minuspunkte entfernt werden?