Octaveによる主成分分析の計算

Matlabにはprincompという主成分分析を計算する関数があるけれど、Octaveには見あたらなかったので、英語版Wikipediaに書かれていたやり方どおりに作ってみました。

[pc, score, latent] = princomp(A);

みたいに使えます。pcが主成分の係数、scoreが主成分得点、latentが各主成分の分散値(合計値が100%になるように変換すると寄与率)となります。

function [coeff, score, latent] = princomp(X)
B = X - repmat(mean(X), size(X,1), 1);
C = cov(B);
[V,D] = eig(C);
[s, index] = sort(diag(D), 'descend');
coeff = V(:,index);
latent = s;
score = B * coeff;

同じデータに対してMatlabのprincompと同じ結果が出たので、複素数になると自信ないですが、とりあえず実数の範囲では大丈夫そう。