olearning-prml13
DESCRIPTION
Learning ML at GrandFront in Osaka, chapter11 source code: https://github.com/u651601f/OLerning-PRMLTRANSCRIPT
Text
Osaka PRML Learning 13Kousuke Takeuchi
CHAPTER 13
教師なし次元削減 (Unsupervised Dimensionality Reduction)
多次元データの恐怖 (Fear of Multidimensional Data)
1次元あたり5つのデータが存在
e.g.) x = [1,2,3,4,5]
!
2次元になると…
e.g.) xy = [(1,1), (1,2),…., (1,5), (2,1),…(5,5)]
つまり、5 × 5 = 25個のデータが存在
!
n次元になると、5 × 5 × 5 × ・・・= 5^n個のデータが存在 (指数的)
埋め込み行列T(Embedded Matrix)を使って、行列積による変換をする
!
→ 変換後のデータzにTの逆行列をかけると元のデータに戻る
d次元のデータをm次元に (transform d-dim data to m-dim)
Section 1
主成分分析 (Principal Component Analysis)
主成分分析の手順 (How to PCA)
1. 主成分分析の基準面(線)を 決める
2. 基準から各データへの距離をとる。この距離は数学的に正射影(Orthogonal Projection)と呼ぶ
3. この距離を多次元データの主成分とする
正射影の条件から埋め込み行列へ (Calculate Embedded)
z が x の正射影になるとき、以下の式が成り立つ
!
ここで、埋め込み行列Tによって変換された z に、Tの転置行列をかけて、元の x に戻ればよい。(完全に元には戻らない)
(x) -> 変換 -> (z) -> 逆変換 -> (x’) と、元の x との誤差 || x’ - x || が最小になるように T を決定する
線形代数学の二次形式の公式を使うと・・・
!
ただし、Cは標本の分散共分散行列(Variance-covariance matrix)を表す
!
従って、学習基準は次式で表される
学習基準の式は、固有値問題の形式に変換出来るので、以下の固有値問題を解けば埋め込み行列Tが算出出来る
!
固有ベクトルをξ1, ξ2, ・・・, ξmとすると、
Rで主成分分析1. 標本データの分散共分散行列を作成
2. 分散共分散行列の固有値問題を解いて、固有ベクトルを取り出す
3. 固有ベクトルと標本データの行列積を計算すれば、主成分分析の完了
まずは主成分分析を極めよう (You should start PCA)
参考書には、主成分分析の他にもカーネル主成分分析や局所性保存射影などが紹介されていた
しかし、今回紹介した主成分分析だけでも、かなりのデータを分析できる
e.g.) 偏差値というのは分散を元に計算されるため、数学と物理のテストの偏差値を同等に扱えない。
→ 主成分分析を使うと物理と数学のテストの点数の重みが同じになり、数学: 60, 物理: 80なら、140の学力があると計算出来る
→ 数学的には「マハラノビス距離」というが、参考書の範囲外なので割愛
Section 2
主成分分析を使ったプログラム (Program using PCA)
新聞社を分類する新聞社の内部に対する評価のデータを使用
項目は、「社風」「給与」「環境」など
VOKERS(http://www.vorkers.com) のデータを利用
1. データを取り込むJSONデータを用意
データフレームに変換
2. データからPCA先ほど作成したデータフレーム
prcomp関数でPCA計算
計算結果 第n主成分
3. どこまで変数を減らせるか?
累積寄与率 → 元の変数の情報をどれだけ含んでいるか
95%の寄与率を満たしているので、第1~4主成分までを新しい変数とする
4. 次元を4つに減らしてクラスタリング
k平均法の関数
クラスタリングされたデータのグラフを表示するライブラリを使用
5. 結果 (k = 4で分類)
主成分分析で 次元削減したデータ 元のデータ
6. 結果の考察寄与率95%の主成分分析による次元削減をすることによって、元のデータの情報を壊さずに変換する
その結果、クラスタリングをしても、元の次元が高いデータと全く同じクラス分けが出来た
このクラスタリングを1000回実行して、計算速度を測ると、次元削減したデータの方が高速で実行出来る
!
今回は次元数を8から4にしか減らせず、更にデータ自体も少ないので、そこまで速度改善は感じることは無かったが、今後大規模なデータ(画像、文章など)を解析する場合にとても役立つと思う
PCA: 元のデータ:
最後に
機械学習ライブラリ
Java : Apache Mahout
Python : scikit-learn, NLTK(自然言語処理)
Ruby : ai4r, cabalist(Rails Gem) ・・・遅い。
他のおすすめ言語 : Clojure, Scala(ScalaNLP)
機械学習の実用例異常検出 : クレカなどの不正利用の発見
レコメンデーション : FBやAmazonなど有名
メールのスパムフィルター (SVM)
画像認識 (クラスタリング)
→ まだ応用実績が少ないように思える