K-meansとは
「K-means(K-平均法)」とは機械学習の手法の一つで、クラスタの平均を用いて与えられたクラスタ数(k個)に分類する手法のこと。
機械学習のうちラベル付けされていないデータに対応する教師なし学習の一つで、データをグループ化する「クラスタリング」に該当する。
K-means自体は、クラスタリングのうち「非階層的クラスタリング」に該当するが、クラスタ分析自体には他に「階層的クラスタリング」がある。
PythonにおけるK-means
Scikit-learでK-meansが使えるため、分析するだけであれば以下のとおり簡単に行える。
from sklearn.cluster import KMEANS km = KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm=’auto’)
あとは、fitしてpredictして終わり。
sklearn.cluster.KMeans クラスの引数
n_clusters | 生成するクラスタ数。オプション。数値型で、デフォルトは8。人力で対応する必要があるもっとも重要な値。 |
---|---|
init | 初期化の方法。「k-means++」、「random」、「ndarray」 を指定し、デフォルトは「k-means++」。基本デフォルトを使用する
K-means++:最初のクラスタの中心をK-means++法を用いて選択する。 random:最初のクラスタの中心をランダムに選択する。 ndarray:? |
n_init | 異なる乱数のシードで重心を選ぶ処理の実行数。最初から実行しなおす回数。 数値型で、デフォルトは10。処理時間が許せば大きいほうが良い。最後のn_jobsが関係してくる。 |
max_iter | クラスタの中心点の移動を行う最大反復回数で、回数に達したら処理が終了する。数値型で、デフォルトは300。 |
tol | 収束(処理終了)の判定用の許容可能な誤差(中心点の移動距離)。浮動小数点型で、デフォルトは1e-4。サンプル値の大きさによってデフォルト値を変更する必要がある。 |
precompute_distances | 高速化のため、データの距離を事前計算する(多くのメモリが必要)。「auto」、「True」、「False」 から指定し、デフォルトはauto。
auto:n_samples * n_clusters > 1200万 の場合に、計算を行わない。(1ジョブあたり100MBのオーバーヘッド) True:常に事前計算する。 False:事前計算しない。 |
verbose | 進捗度を表示する。数値型で0か1を指定し、デフォルトは0で表示しない。非常に長時間かかる場合は設定したほうが良い。 |
random_state | 乱数ジェネレータのシードを固定するかどうか。オプション。数値型かRandomState instanceで指定し、デフォルトはNone。 |
copy_x | 距離を事前に計算する場合、メモリ内でデータを複製してから実行するかどうか。boolean型で、デフォルトはTrue。 |
n_jobs |
計算に使用するジョブの数で、n_init実行を並列に計算することによって機能する。 -1の場合すべてのCPUが使用される。1を指定すると並列計算されないためデバッグに役立ちます。-1以下では、(n_cpus + 1 + n_jobs)が使用され、-2では、1つを除くすべてのCPUが使用される。デフォルトは1だが、CPUコア数によっては変更したほうが良い。 |
sklearn.cluster.KMeans クラスのメソッド
fit(X[, y]) | クラスタリングを計算する。 |
---|---|
fit_predict(X[, y]) | クラスタの中心を計算し、各サンプルのクラスタを求める。 |
fit_transform(X[, y]) | クラスタリングを計算し、X を距離空間に変換する。 |
get_params([deep]) | 計算に用いたパラメータを取得する。 |
predict(X) | X が属するサンプルに最も近いクラスタを求める。 |
set_params(**params) | パラメータを設定する。 |
transform(X[, y]) | X を距離空間に変換する。 |
K-meansの手法
手法はシンプルで、以下の順に行われる。
1.クラスタの中心点の初期値を、サンプルの中から指定した個数(K個)をランダムに選ぶ。個数については、ユーザが考えて指定(n_clusters)する必要があるが、エルボー法や、シルエット図などの方法により、適切な個数を推測していく。(K-means++法では、互いに離れた位置に配置)
2.各サンプルを最も近い(ユークリッド 距離 の 2 乗)中心点に割り当ててクラスタを作成する。
3.サンプルの配置後、クラスタの実際の中心(平均)を計算し、そこを新たな中心点としてクラスタを配置し直す。
4.2~3を繰り返す。割り当てられるサンプルが変わらなくなったら終了。または、4で更新した中心点と更新前の中心点との距離が、指定した許容値以下になった、指定したイテレーションの最大回数まで繰り返したら終了。
問題点
K-means法の問題点は以下の二点。ただ二点目はscikit-learnではうまく処理してくれるようで、気をつけないといけないのは一点目。
・クラスタ数の指定を人力でやる必要がある。
・空になるクラスタが存在する可能性がある。