主成分分析用の独自の関数であるPCAを記述しようとしています(もちろん、既に多くの記述がありますが、自分で実装することに興味があります)。私が遭遇した主な問題は、交差検証ステップと予測二乗和(PRESS)の計算です。どの交差検証を使用するかは関係ありません。これは主に背後にある理論についての質問ですが、Leave-one-out交差検証(LOOCV)を検討してください。理論から、LOOCVを実行するには次のことが必要であることがわかりました。
- オブジェクトを削除する
- 残りをスケール
- いくつかのコンポーネントでPCAを実行する
- (2)で取得したパラメーターに従って削除されたオブジェクトをスケーリングする
- PCAモデルに従ってオブジェクトを予測する
- このオブジェクトのPRESSを計算します
- 同じアルゴリズムを他のオブジェクトに再実行する
- すべてのPRESS値を合計します
- 利益
私はこの分野で非常に新しいので、私が正しいことを確認するために、結果を私が持っているいくつかのソフトウェアからの出力と比較します(また、いくつかのコードを書くために、ソフトウェアの指示に従います)。残差二乗和とを計算するとまったく同じ結果が得られますが、PRESSの計算は問題です。
相互検証ステップで実装することが正しいかどうか教えてください。
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
変数を使用して追加の正規化を行います。私が見つけた唯一の理由は、堅牢なPCAにLOOCVを適用したことです。残念ながら、私はソフトウェアのデモ版しかないので、サポートチームは私の質問に答えたくありませんでした。
tempRepmat(kk,kk) = -1
ます。ラインの役割は何ですか?前の行でtempRepmat(kk,kk)
-1が保証されていませんか?また、なぜマイナス?とにかくエラーは二乗されるので、マイナスが削除されても何も変化しないことを正しく理解できますか?