Coursera Machine Learning - Week8-2 Dimensionality Reduction
CourseraのMachine Learningについてまとめています。 前回は、Week8の前半、Unsupervised Learning(教師なし学習)ついてまとめました。
今回は、Week8の後半、Dimensionality Reductionについて学びます。
Dimensionality Reduction
今回は、クラスタリングとは別の教師なし学習である、Dimensionality Reduction(次元削減)について学びます。主に、PCA(Principal Component Analysis / 主成分分析)について扱います。
次元削減を行う動機の1つとしては、データ量の圧縮があり、データの圧縮を行うことにより、必要なメモリやディスク容量を削減し、また学習アルゴリズムの高速化も行うことができるそうです。
次元削減の分かりやすい例として、cmとinchの2のFeatureがあったとします。両方が長さの情報であり、下記図のように、この2つのFeatureを近似した緑の直線上に、cmとinchのデータを射影させれば、1つの長さの情報として扱うことができ、2次元から1次元へ変換することが可能です。
3次元から2次元への次元削減も同様で、下記のような3次元のデータがあったとして、そのデータを近似できるz1, z2で定義できる平面を新たに定義すれば、3次元から2次元のデータへ、次元を減らすことができます。
また、次元削減を行うもう一つの動機として、Data Visualization(データの可視化)があげられるそうです。例えば、6次元のデータがあったとして、それをみても人が理解しやすいようにプロットすることは難しいので、そのデータを2次元や3次元に次元を削減することによって、人が理解しやすいように、データを可視化することが可能になるとのことです。
Principal Component Analysis (PCA / 主成分分析)
ここから、次元を削減するためのアルゴリズムの1つである、主成分分析について学んでいきます。
例えば、2次元を1次元に削減したい場合、下記図のような黒丸のデータがあったとして、次元を削減するために、2次元のデータを射影するための直線を引く必要があります。赤線がその直線のよい例で、この場合、各データとの距離(青い実線)は小さくなります。この距離は、射影誤差とも呼ばれ、これを最小化する線(3次元から2次元では、平面)を探すことがPCAが行うことです。一方で、オレンジ色の線は、射影誤差(青い点線の長さ)が大きく、良くない例と言えます。
PCAがやることをもう少し数学的に記載すると、n次元からk次元へ次元削減を行いたい場合、データの射影誤差を最小化する、k次元の平面(k個のベクトルu(1), u(2), … , u(k))を探すということです。
また、PCAを適用する際には、まず平均標準化(平均値を0にする)とフィーチャースケーリングを行っておくのが良いとのことです。
次に、実際のPCAの計算方法を学んでいきます。数学的な導出や証明は本コースでは特に学習せず、どのように利用するかを学習します。
平均標準化、フィーチャースケーリング後に、PCAで次元を削減(n次元からk次元へ削減)する際に行うことは、まずは、Covariance matrix(共分散行列)を計算することです。共分散行列(Σ)は下記の数式で表され、x(i)がn×1のベクトルのため、Σはn×nの行列となります。
次に、得られた共分散行列Σに対し、Eigenvectors(固有ベクトル)を計算します。固有ベクトルの計算は、Matlab/Octaveでは、下記のコマンドで行うことができます。
- [U,S,V] = svd(Sigma)
svdは、Singular Value Decompositionの略です。
固有ベクトルの計算の結果、下記のようなn×nの行列であるU行列を得ることができます。
このU行列に対し、先頭からk個分のベクトル(次元削減後の次元数分)を抜き出し、xを掛ければ、次元削減後のk次元のベクトルであるzを得ることができます。
Reconstruction from compressed representation
次元削減後のzから、次元削減前のxの近似値xapproxを求めるには、下記図式のように計算を行えば求めることができます。
Choosing the number of principal components(主成分の数kの選び方)
次元削減後の次元数kは、主成分の数とも呼ばれ、ここではその選び方を学びます。
まず、Average squared projection error(二乗射影誤差の平均)と、Total variation in the data(データ全体の分散)は、下記の式から得ることができます。
kを選ぶ際には、これらの値の比を0.01以下(1%以下)にするのが良いとのことです。1%以下にした場合には、99%の分散が保持されていると言い換えられ、どれだけの分散を保持したいかによって、0.01を小さくしたり大きくしたりするそうです。(0.05以下にすれば、95%の分散が保持される。95%も良く使われるらしい)
また、この値は、固有ベクトルを計算した際に用いた下記のコマンドから得られるS行列からも得ることができるそうです。
- [U,S,V] = svd(Sigma)
S行列は、n×nの正方行列であり、対角成分以外は0の下記のような行列とのことです。このS行列を用いることにより、先ほどの数式を下記のように書き直すことができるとのことです。
PCAを用いて、99%の分散を保持して、次元を削減する場合は、上記の数式が0.99以上となる最小のkを選べば良いということになります。
ここまでPCAについて学んできましたが、前半部分で記載した通り、PCAを用いて次元を削減する目的は、メモリやディスクの容量を削減し、トレーニングの速度を向上させる、もしくは、可視化のために次元数を減らすということです。
分散をある程度維持したとしても、PCAを用いることにより、データの内容関係なく、データを削減することとなり、重要なデータを削減してしまう可能性もあるため、オーバーフィッティングに対応するため等、PCAの目的外での利用はやめた方が良いとのことです。機械学習システムを構築する場合は、まずは、PCAを用いずにオリジナルのデータを用いてトレーニングを行い、メモリやディスク容量、トレーニング速度の問題があった場合のみPCAを利用するのが良いとのことです。
プログラミング演習
Week8のプログラミング演習では、まずは、K-meansクラスタリングアルゴリズムを構築し画像の圧縮を行い、次に、PCAを用いて次元削減を行った顔画像の生成を行います。演習の項目は、具体的には以下のものです。
- Find Closest Centroids
- Compute Centroid Means
- PCA
- Project Data
- Recover Data
次回は、Week9の前半、Anomaly Detectionについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learningまとめ本記事を読んでいただきありがとうございます。
機械学習を実際に使うにあたり、Coursera MLと合わせておすすめしたい書籍を紹介します。
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
scikit-learnを用いた機械学習を学ぶのに最適な本です。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
Deep Learningと言えばこれ。TensorFlowやPyTorch等のフレームワークを用いずに、基礎の理論からDeep Learningを実装します。Week4、Week5の記事を読んで、より深く理解したいと思った人におすすめです。
Kaggleで勝つデータ分析の技術
データ分析について学び始めた人におすすめです。