ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

k-means クラスタリング

k-means クラスタリングの紹介

k-means クラスタリングは、分割を行うための方法です。関数 kmeans は、データを k 個の互いに排他的なクラスターに分割し、各観測値が割り当てられたクラスターのインデックスを返します。階層的なクラスタリングと異なり、k-means クラスタリングは、非類似度の測定値のより大きな集合ではなく、実際の観測値で動作し、単一レベルのクラスターを作成します。この違いのため、大量のデータを処理する場合、k-means クラスタリングの方が階層的なクラスタリングより適していることが多くあります。

kmeans は、データ内の各観測値を、空間内のある位置をもつオブジェクトとして取り扱います。これは、各クラスター内のオブジェクトができるだけ互いに近くにあり、他のクラスターのオブジェクトからはできるだけ遠くにあるような分割を探します。クラスタリング対象のデータの種類に合わせて、5 つの異なる距離計量から選択できます。

分割の各クラスターは、メンバー オブジェクト、その重心あるいは 中心により定義されます。各クラスターの重心は、そのクラスター内のすべてのオブジェクトからの距離の総和が最小になる点です。関数 kmeans は、指定された尺度に関する総和が最小になるように、距離計量ごとに異なる方法でクラスターの重心を計算します。

kmeans に対する、いくつかのオプションの入力パラメーター (クラスターの重心の初期値に対するパラメーターや繰り返しの最大数に対するパラメーターがあります) を使って、最小化の詳細を制御できます。既定の設定では、kmeans はクラスター中央の初期化に k-means++ アルゴリズムを使用し、距離の判定には二乗ユークリッド計量を使用します。

クラスターの作成と分割の決定

以下の例は、点を 3、4、5 個のクラスターに分割する結果を分析することによって、4 次元データの可能なクラスタリングを探索します。

メモ:

この例の各部分が乱数を連続して生成するので、つまり、新しい状態を設定しないため、示された結果を再現するためには一連のステップすべてを連続して実行しなければなりません。ステップを連続して実行しない場合、答えは本質的に同じになりますが、中間結果、反復数、またはシルエット・プロットの順序は異なるかもしれません。

はじめに、データを読み込みます。

rng default  % For reproducibility
load kmeansdata
size(X)
ans = 1×2

   560     4

これらのデータは 4 次元なので、可視化は容易ではありませんが、kmeans を使用してデータ中にグループ構造があるかどうかを調べることができます。目的のクラスター数 k、ここでは 3、で kmeans を呼び出します。この例では、尺度として市街地距離を指定し、既定の k-means++ アルゴリズムをクラスター中心の初期化に使用します。

idx3 = kmeans(X,3,'Distance','cityblock');

kmeans からのクラスター インデックス出力を使ってクラスター プロットを作成すると、結果のクラスターがどれほど十分に分離しているかわかります。シルエット プロットは、1 個のクラスター中の各点が近隣のクラスター中の点にどれくらい接近しているかについて基準を表示します。この尺度の範囲は、+1 から、0 を通り、-1 までです。+1 は隣接するクラスターから非常に遠い点を示し、0 はいずれかのクラスター内に含まれているかどうかがあいまいな点を示し、-1 は適切でないクラスターに割り当てられた確率が高い点を示します。silhouette は、その 1 番目の出力でこれらの値を返します。

figure
[silh3,h] = silhouette(X,idx3,'cityblock');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

シルエット プロットから、2 番目のクラスターの大部分の点は、0.6 よりも大きい大きなシルエット値をもっており、そのクラスターが近隣のクラスターからある程度分離されていることがわかります。一方、3 番目のクラスターにはシルエット値の低い点が多く含まれており、また 1 番目と 3 番目のクラスターには負の値をもつ点がいくつか含まれていることから、これら 2 つのクラスターが十分には分離されていないことがわかります。

クラスターの適切な数の決定

クラスター数を増やして、kmeans が、データのより適切なグループ化を見つけることができるかどうか調べます。ここでは、'Display' 名前と値のペアの引数を使用し、各反復に関する情報を表示します。

idx4 = kmeans(X,4, 'Distance','cityblock','Display','iter');
  iter	 phase	     num	         sum
     1	     1	     560	     1792.72
     2	     1	       6	      1771.1
Best total sum of distances = 1771.1

この解に対するシルエット プロットは、これら 4 つのクラスターが、前の解の 3 つのクラスターよりも、より適切に分離されていることを示します。

figure
[silh4,h] = silhouette(X,idx4,'cityblock');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

2 つの解を比較するより定量的な方法は、2 つの場合について、平均のシルエットの値を調べることです。

cluster3 = mean(silh3)
cluster3 = 0.5352
cluster4 = mean(silh4)
cluster4 = 0.6400

最後に、5 つのクラスターを使ってデータのクラスタリングを試みます。

idx5 = kmeans(X,5,'Distance','cityblock','Replicates',5);
figure
[silh5,h] = silhouette(X,idx5,'city');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

mean(silh5)
ans = 0.5266

このシルエット プロットは、クラスターの 2 つは、ほとんど低いシルエットの値をもつ点を含むため、これがおそらくクラスターの正しい数ではないことを示します。どれだけ多くのクラスターがデータに実際にあるかについて何らかの知識がない場合、ある範囲内の複数の k の値を使って実験するのは良いアイデアです。

局所的最小値の回避

他の多くの数値的最小化の場合と同様に、kmeans によって到達する解は、開始点に依存する場合もあります。kmeans は、他により適切な解が存在するが、新しいクラスターに任意の 1 点を再割り当てすることで、点と重心間距離の総和が増加するような局所的最小値に到達するかもしれません。ただし、'Replicates' 名前と値のペアの引数を使用し、この問題を解決できます。

4 つのクラスターに 5 回の複製を指定し、'Display' の名前と値のペアの引数を使用して、それぞれの解に最終的な距離の合計を表示します。

[idx4,cent4,sumdist] = kmeans(X,4,'Distance','cityblock',...
                       'Display','final','Replicates',5);
Replicate 1, 4 iterations, total sum of distances = 1771.1.
Replicate 2, 2 iterations, total sum of distances = 1771.1.
Replicate 3, 5 iterations, total sum of distances = 2303.45.
Replicate 4, 4 iterations, total sum of distances = 2303.45.
Replicate 5, 6 iterations, total sum of distances = 1771.1.
Best total sum of distances = 1771.1

kmeans は、5 つのうち 2 つの複製で局所的な (大域的ではない) 最小値を検出しました。これら 5 つの複製のそれぞれは、無作為に選択した異なる重心の初期値から始まっているので、kmeans は 2 つ以上の局所的な最小値を見つける場合があります。しかし、kmeans によって返される最終的な解は、すべての複製のうちで距離の総和が最小値となる解になります。

sum(sumdist)
ans = 1.7711e+03

関連するトピック