らんだむな記憶

blogというものを体験してみようか!的なー

特徴量の次元を低下させるとか

octave遊び。
PCAを使った特徴量の次元の低下について、やはり色々分かりにくいので図示。
2D->1Dくらいしかまだやり方分からないから(octaveでまだうまく平面を図示できない...)、しょっぱいけど以下のような感じで。
特徴量ベクトルを3点とって(X)、描画(黄色い○)。手間を省くために、予め3点の平均が原点になるように調節済み。
そこから作られる対称半正定値な共分散行列( (1/m) * X' * X )を対角化(svd(Sigma))して、最大の固有値に対応する固有ベクトルを取得(U(:, 1:K))。
この固有ベクトルが張る超平面(っても、ここでは直線...: y = grad * x)を描画。
更に、特徴量ベクトルの超平面への射影した結果を計算(X * U_reduce)。
なんか誤解している気もぷんぷんするが、これをパラメータとして超平面上のポイント(proj = t * U_reduce')を描画(赤い+)。

X = [
    2, 3;
    4, 20;
    -6, -23;
];

figure('Position',[0, 0, 500, 500]);

% plot feature vectors
plot(X(:, 1), X(:, 2), 'ko','LineWidth', 1, 'MarkerFaceColor', 'y', 'MarkerSize', 7);
hold on;

% axis square
axis([-30 25 -30 25], 'square');

% diagonalization of the covarinace matrix
[m, n] = size(X);
Sigma = (1/m) * X' * X;
[U, S, V] = svd(Sigma);

% pick eigen vectors belonging to larger eigen values
K = 1;
U_reduce = U(:, 1:K);

% plot subspace spanned by eigen vectors
x = [-7:7];
grad = U_reduce(2,1)/U_reduce(1,1);
y = grad * x;
plot(x, y);

% features projected onto the subspace
t = X * U_reduce;
proj = t * U_reduce';
plot(proj(:, 1), proj(:, 2), 'k+','LineWidth', 1, 'Color', 'r', 'MarkerSize', 7);
hold off;

で描いたグラフを閲覧。それっぽいかな。
射影位置は超平面への垂直な射影かと思っていたんだがそうでもないのかな...。
x軸とy軸の比率が異なっていたから歪んで見えてた...。アスペクト比を1:1にして描き直した...。プロットの絵がイマイチだが、まぁ一応直交射影っぽくなったであろう...。

f:id:derwind:20150927040956j:plain