概要

Python機械学習プログラミングの学習メモです。
勉強会用の資料があるのでこちらでは資料に載らなかったメモ等を。

今回は、第5章 次元削減でデータを圧縮する

前回: nownab.log | Python機械学習プログラミング 第4章

資料

環境

本書の各バージョンは結構古いので、できるだけ新しいバージョンを使うようにしている。

  • Python 3.6.4
  • scikit-learn 0.19.1
  • matplotlib 2.1.1

メモ

5.1 主成分分析による教師なし次元削減

急に共分散行列とか固有値が出てきて、は?ってなったけど下の記事がだいぶわかりやすかった。

固有ベクトル、主成分分析、共分散、エントロピー入門 | コンピュータサイエンス | POSTD

5.1.1 共分散行列の固有対を求める

5.1.2 特徴変換

np.newaxisとはなんぞ。ということで調べてみた。np.newaxis自体はただのNone。numpyのsliceに自動でshapeをよろしくやってくれる機能があって、Noneのかわりにnp.newaxisって書くとかっこいいぜってことらしい。

>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> a[:, np.newaxis]
array([[1],
       [2],
       [3]])

# Noneでも同じ
>>> a[:, None]
array([[1],
       [2],
       [3]])

# reshapeでもできる
>>> a.reshape(3, 1)
array([[1],
       [2],
       [3]])

# numpyじゃないと効かない
>>> c = [1, 2, 3]
>>> c[:, np.newaxis]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple

5.1.3 scikit-learn の主成分分析

5.2 線形判別分析による教師ありデータ圧縮

ここでのLDAはLinear Discriminant Analysisで、Latent Dirichlet Allocationとは別物

全然関係ないけどなんでnotesにも同じこと書いてあるんだ…?誤植?

5.2.1 変動行列を計算する

5.2.2 新しい特徴部分空間の線形判別を選択する

5.2.3 新しい特徴空間にサンプルを射影する

5.2.4 scikit-learn による LDA

sklearn.lda.LDAはもうなくなってたので、sklearn.discriminant_analysis.LinearDiscriminantAnalysisを使った。
ディリクレさんのLDAが実装されたのと同じタイミングで名前変わったっぽいから混同しないようにかな。

5.3 カーネル主成分分析を使った非線形写像

5.3.1 カーネル関数とカーネルトリック

5.3.2 Pythonでカーネル主成分分析を実装する

scipy.spatial.distance.pdist — SciPy v1.0.0 Reference Guide

seuclideanは標準化されたユークリッド距離

>>> x = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> pdist(x)
array([ 5.19615242, 10.39230485,  5.19615242])

scipy.spatial.distance.squareform — SciPy v1.0.0 Reference Guide

>>> sq_dists
array([ 5.19615242, 10.39230485,  5.19615242])
>>> squareform(sq_dists)
array([[ 0.        ,  5.19615242, 10.39230485],
       [ 5.19615242,  0.        ,  5.19615242],
       [10.39230485,  5.19615242,  0.        ]])

5.3.3 新しいデータ点を射影する

5.3.4 scikit-learn のカーネル主成分分析

Python機械学習プログラミング

機械学習勉強会について

社内で毎週開催している。本書は輪読形式でまわしているが、題材によって形式は柔軟に変えている。
毎週読む範囲を決めて資料にまとめて発表するという感じでやっている。

また、勉強会で書いたコードや疑問点などをまとめるためにGitHubのレポジトリを活用している。
Wondershake/machine-learning-study: 機械学習勉強会