konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

教師なし学習をPythonで実装してみる(PCAとk平均法)

前回、教師あり学習の回帰モデルを練習してみたので
次は教師なし学習の実装に挑戦

教師なし学習の大まかな種類

・可視化・次元削減:説明変数の数を減らす
クラスタリング:分類わけ
・相関ルール学習:異常検知

f:id:konchangakita:20200105204549p:plain
図のセンスない

例によってPython実装を目的なので中身の説明はよそさんにおまかせ

Pythonで実装

次元削減

PCA(主成分分析)を使って3次元データを2次元に削減

3次元のデータ読み込み

import numpy as np
data = np.loadtxt('./data1.txt') 
data.shape

(60, 3)

サクッと2次元に削減

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X2D = pca.fit_transform(data)
X2D.shape

(60, 2)



クラスタリング

データの似ているもの同士をグループにまとめる作業
k平均法を使ってみる

データを読み込んでそのまんまグラフ表示

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
%matplotlib inline

data2 = np.loadtxt('./data2.txt') 

plt.plot(data2[:, 0], data2[:, 1], 'bo')
plt.show()

f:id:konchangakita:20200105205053p:plain

k平均法のライブラリを読み込んで3グループに分類してみます

from sklearn.cluster import KMeans
km = KMeans(3) # 3種類のグループに分ける

data2_clst = km.fit_transform(data2)
color = ["red", "blue", "green"]
for i in range(data2.shape[0]):
    plt.scatter(data2[i,0], data2[i,1], c=color[int(km.labels_[i])])
plt.show()

f:id:konchangakita:20200105205740p:plain
きれいに分類されましたね
KMeans(3)の数値を変えてやると分ける数を変えることもできます

from sklearn.cluster import KMeans
km = KMeans(5) # 5種類のグループに分ける

data2_clst = km.fit_transform(data2)
color = ["red", "blue", "green", "yellow", "black"]
for i in range(data2.shape[0]):
    plt.scatter(data2[i,0], data2[i,1], c=color[int(km.labels_[i])])
plt.show()

f:id:konchangakita:20200105210044p:plain
5色カラフルーになりました

感想

sklaernには既にいろんなライブラリが用意されているので、正直中身のアルゴリズムわかんなくても実装も簡単にできちゃいます