Sto cercando di scrivere la mia funzione per l'analisi dei componenti principali, PCA (ovviamente ce ne sono già molti scritti ma sono solo interessato a implementare cose da solo). Il problema principale che ho riscontrato è la fase di convalida incrociata e il calcolo della somma dei quadrati prevista (PRESS). Non importa quale convalida incrociata io uso, è una domanda principalmente sulla teoria alla base, ma considera la convalida incrociata unilaterale (LOOCV). Dalla teoria ho scoperto che per eseguire LOOCV devi:
- elimina un oggetto
- ridimensionare il resto
- eseguire PCA con un certo numero di componenti
- ridimensionare l'oggetto cancellato in base ai parametri ottenuti in (2)
- prevedere l'oggetto secondo il modello PCA
- calcola PRESS per questo oggetto
- rieseguire lo stesso algoritmo su altri oggetti
- sommare tutti i valori PRESS
- profitto
Perché sono molto nuovo nel campo, per essere sicuro di avere ragione, confronto i risultati con l'output di alcuni software che ho (anche per scrivere un codice seguo le istruzioni nel software). Ottengo completamente gli stessi risultati calcolando la somma residua di quadrati e , ma calcolare PRESS è un problema.
Potresti dirmi se ciò che implemento nella fase di convalida incrociata è giusto o no:
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);
Nel software ( PLS_Toolbox ) funziona in questo modo:
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
Quindi, fanno qualche ulteriore normalizzazione usando questa tempRepmat
variabile: l'unica ragione per cui ho scoperto era che applicano LOOCV per un PCA robusto. Sfortunatamente, il team di supporto non ha voluto rispondere alla mia domanda poiché ho solo una versione demo del loro software.
tempRepmat(kk,kk) = -1
linea? La riga precedente non garantisce già che siatempRepmat(kk,kk)
uguale a -1? Inoltre, perché gli svantaggi? L'errore verrà comunque quadrato, quindi capisco correttamente che se i punti negativi vengono rimossi, nulla cambierà?