K-means法
〇K-means法とは?
→異なる性質が混在している集団から、互いに似た性質をもつものを集め、クラスターを作る手法。
〇クラスタリングの流れ
1.ランダムにクラスタリングしたい数の点をプロット
2.割り振ったデータをもとに各クラスタのクラスを推定
3.推定したクラスごとの重心を算出する
4.1~2をリピート
〇K-means法をPythonで使う方法
<手順①>ライブラリのインポート
from sklearn.cluster import KMeans
<手順②>インスタンス作成
kms=KMeans()
<手順③>クラスタリング
kms.fit_transform(X)
〇K-means法の使用方法
sklearn.cluster
KMeansというモジュール
【k-means()の引数】
・引数n_clusters: クラスタ数(デフォルトは8)
・引数max_iter:繰り返し回数の最大(デフォルトは300)
・引数n_init: 初期値選択において、異なる乱数のシードで初期の重心を選ぶ処理の実行回数(デフォルトは10)
・引数init: 初期化の方法('k-means++', 'random')(デフォルトは'k-means++')
・引数tol:収束判定に用いる許容可能誤差(デフォルトは0.0001)
・引数random_state: 乱数
・引数copy_x: メモリ内でデータを複製してから実行するかどうか(デフォルトはTrue)
・引数n_jobs: 並列処理する場合の多重度(デフォルトは1)
【クラスのメソッド】
・fit(X):クラスタリングの計算の実行
・fit_predict(X):各サンプルに対する、クラスタ番号を求める
・fit_transform(X): クラスタリングの計算を行い、Xを分析に用いた距離空間に変換して返す
・predict(X): Xのサンプルが属しているクラスタ番号を返す
・inertia_: 各クラスター内の二乗誤差を返す
【参考サイト】
http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/
<手順①>ライブラリのインポート
# ライブラリのインポート
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# データの準備
iris = load_iris()
X = iris.data
y = iris.target
<手順②>インスタンス作成、クラスタリング実行
# インスタンス作成
kms = KMeans(n_clusters=3)
# クラスタリング実行
print(kms.fit_predict(X))
その後クラスタリング用のインスタンスを作成し、fit_predictにてクラスタリングしたいデータを指定します。
〇エルボー法を使ったK-meansクラスタリング
【エルボー法とは?】
正解ラベルがわかっていない状態で、データの適切なクラスタ数を推定する手法。
・コスト関数をY軸、クラスタ数をX軸
・クラスタ数Kを増加するとコストが低下することを想定
・下がり幅の効率が最も良い点のクラスタ数を適切なクラスタ数とする。
・傾きが端的に変化している点(=エルボーの位置)の数のクラスタに分類するのが最も効率が良いとする考え方。
【エルボー図】
・クラスター数は可変してクラスタリングすることは、k-meansのクラスタ数を変えていくことで実現可能となります。
・Y軸のコストはどのように設定することができるでしょうか。
コストに関してはscikit-learnのk-meansクラスのメソッドinertia_を用いる。
〇エルボー図の設定手順
<手順①>ライブラリのインポート、データセット
# ライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
# データセットの作成
iris = load_iris()
X = iris.data
Y = iris.target
<手順②>エルボー法の実施
In [1]: # エルボー法の実施
distortions = []
for i in range(1, 11):
km = KMeans(n_clusters=i)
km.fit(X)
distortions.append(km.inertia_)
・クラスタ数を1から10までfor文を用いてクラスタリングします。
・各々でクラスタ数で得られたコストinertia_をリスト(distortions)に保持。
・最後にそのリスト(distortions)に格納されている値をプロット
plt.plot(range(1, 11), distortions, marker="o")
plt.xticks(np.arange(1, 11, 1))
plt.xlabel("Number_of_clusters")
plt.ylabel("Distortion")
plt.show()
この図から傾きが極端に変化している点(=エルボーの位置)を確認すると、K=2かK=3の時が適切であると判断することが可能