k-means

この記事は約5分で読めます。

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ではうまく処理してくれるようで、気をつけないといけないのは一点目。

・クラスタ数の指定を人力でやる必要がある。

・空になるクラスタが存在する可能性がある。

タイトルとURLをコピーしました