教師なし学習について (E資格対策)

目次がQiitaで表示した際、右のほうにすでにあることを知る。

#教師なし学習とは
正解情報(=教師データ)を持たない学習を指します。
主に

次元削減
特徴抽出
表現学習
クラスタリング

に用いられます。
今回は代表的な手法を紹介します。

##主成分分析(PCA)-イチブでゼンブ
データの説明に重要な一部の特徴を抽出する手法です。

超極端な例えをするので、正確に言うと少し異なりますがご了承ください。
たとえば下の写真のような人の写真が何枚かあったとします。

![syuseibunrei1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/bbaec708-9e68-ab84-32e9-b9bf8ed9b7e4.png)

この画像を表現するのに1つ黒く塗った画像を足して表現するとします。

![syuseibunrei2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/ce344ab5-4b8f-d175-dc1d-c15be3d427b1.png)

ですが、この場合このマス目の分だけ画像の処理をしないといけません。ですがこれを



![syuseibunrei3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/d1c75145-d75c-1325-0c26-d023c7b3400a.png)
このような画像の和で表現できればデータの量が少なくて済みます。
これが主成分分析です。

実際に主成分分析した例がこちら。

![pcarei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/a413a983-3f41-cd8a-baf9-6ef904e5769d.png)
一番左列が元画像、次の画像が寄与率（元の画像にどのくらい似ているかの割合）の高い10枚の画像の和で表現した画像、次が50,100,500枚という感じです。
画像は87*65=5655ピクセルありますが、500個ほどの画像を足し合わせるだけで元の画像に近い形に復元できます。

つまり5655個のデータの集まりを500個で画像を表現できます。これによって次元削減、特徴抽出が可能になります。

コードはこちら


```python
from sklearn.datasets import fetch_lfw_people
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import numpy as np

people = fetch_lfw_people(min_faces_per_person=20, resize=0.7)
image_shape=people.images[0].shape

mask=np.zeros(people.target.shape, dtype=np.bool)
for target in np.unique(people.target):
  mask[np.where(people.target==target)[0][:50]]=1

X_people=people.data[mask]
y_people=people.target[mask]

X_people/=255

X_train,X_test,y_train,y_test = train_test_split(X_people,
                                                 y_people,
                                                 stratify=y_people,
                                                 random_state=0)

mglearn.plots.plot_pca_faces(X_train, X_test, image_shape)

```




##k平均クラスタリング-距離ベース

下図のようにやります。
![kmeans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/6702a320-b2c4-f67f-d48c-b8a7040d7fe3.png)

順番を説明しますと

1.入力データが与えられる
2.適当にクラスタセンタを取る
3.入力データを最も近いクラスタセンタが属するクラスにラベル付ける
4.クラスの平均位置にクラスタセンタを更新する
5. 3.4.を繰り返す
6.しばらくするとクラスタセンタが動かなくなり、終了



```python
import mglearn
mglearn.plots.plot_kmeans_algorithm()
```

クラスタセンタの更新が終わると、境界線が得られます。



![kmeansborder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/f26b5488-d68c-b887-6853-32eb3719022f.png)

```python
import mglearn
mglearn.plots.plot_kmeans_boundaries()
```

###k-means++
k平均クラスタリングの改良版。

違いは
・初期値をデータ点の中から選ぶ
・クラスタセンタの更新時に重み確率分布$\frac{D(x)^2}{∑D(x)^2}$を用いて、データ点xから新しいクラスタ中心をランダムにk個選ぶことを繰り返します。
収束が早くなるメリットがあります。
　

##DBSCAN-密度ベース

データ点を
・コア（赤点）：自身から半径$\epsilon$以内に指定個数minPts以上の隣接点がある点
・ボーダー（黄点）：自身から半径$\epsilon$以内に指定個数以上minPtsの隣接点はないものの、コアから$\epsilon$以内にある点
・ノイズ（青点）：それ以外
に分類し、半径$\epsilon$以内にあるコア点同士を結びクラスタ化し、ボーダー店は最近傍のコア点のクラスタに割り当る手法です。
下図を参考にしてください。

![1280px-DBSCAN-Illustration.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/ad396afb-30e4-2d45-594e-7c886c1dba89.png)

引用：https://ja.wikipedia.org/wiki/DBSCAN



###DBSCAN vs kmeans++

http://data-analysis-stats.jp/2019/09/13/dbscan%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E8%A7%A3%E8%AA%AC%E3%81%A8%E5%AE%9F%E9%A8%93/
で手法を比較していたので参考にしてください。

参考文献
https://qiita.com/NoriakiOshita/items/cbd46d907d196efe64a3

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎