trybeetle

take it slow!!

PCA(Principal component Analysis)について


Posted on July 30, 2018, 8:21 a.m.



データの次元を下げるための手法の1つであるPCA(Principal component Analysis)について記載します。
CourseraのMachine Learningコースを元にしています。

次元を下げることで下記のメリットがあります。
・memoryやdiskの使用率を下げる
・処理速度のUP
・2Dや3Dまで落とすことで視覚化する

データの読み込み

まず、データを読み込みます。training dataは、50x2のマトリックスです。今回の例では、2次元のデータを1次元に落とし、変更後の次元数をKとします。


    load ('ex7data1.mat');
    K = 1;

データXをNormalization

training dataset Xを標準化させます。全てのfeatureから重要な特徴を抽出するため、全てのfeatureに対してnormalizationを行う必要があります。


    function [X_norm, mu, sigma] = featureNormalize(X)
    mu = mean(X);
    X_norm = bsxfun(@minus, X, mu);
    sigma = std(X_norm);
    X_norm = bsxfun(@rdivide, X_norm, sigma);
    end

    [X_norm, mu, sigma] = featureNormalize(X);

PCAの実行

まず、svdコマンドで、固有値を算出します。


    function [U, S] = pca(X)
    [m, n] = size(X);
    U = zeros(n);
    S = zeros(n);
    Sigma = 1/m * (X'*X);
    [U,S,V] = svd(Sigma);
    end

    [U, S] = pca(X_norm);

上記で求めた値Uを使用し、変更後の1次元のベクトルZを求めます。


    function Z = projectData(X, U, K)
    Z = zeros(size(X, 1), K);
    Z = X * U(:,1:K);
    end

    Z = projectData(X_norm, U, K);

元の次元へ再構築

PCAで次元を下げたデータを、再度元の次元へ再構築する場合は下記と通りです。


    function X_rec = recoverData(Z, U, K)
    X_rec = zeros(size(Z, 1), size(U, 1));
    X_rec = Z * U(:, 1:K)';
    end

    X_rec  = recoverData(Z, U, K);

次元変更後のデータの評価

PCAを使用して、次元を下げた場合、データの特徴が一部失われる可能性があります。どの程度データを保持できているかを下記の方法で確認することができます。先にsvdで算出したdiagnalなmatrix Sを使用します。

PCAの利用目的に応じて、90%, 95%, 99%と目標とする数値を決め、それに応じた次元数Kを選ぶことがあります。


    retainedRate = sum(sum(S(1:K,:))) / sum(sum(S));

以上です。


Category:ML
Tag: ML Octave
July 30, 2018, 8:21 a.m.

Comments