クラスタリングアルゴリズム-平均シフトアルゴリズム

平均シフトアルゴリズムの概要

前に説明したように、これは教師なし学習で使用されるもう1つの強力なクラスタリングアルゴリズムです。K-meansクラスタリングとは異なり、仮定はありません。したがって、これはノンパラメトリックアルゴリズムです。

平均シフトアルゴリズムは、基本的に、ポイントをデータポイントの最高密度、つまりクラスター重心に向かってシフトすることにより、データポイントをクラスターに繰り返し割り当てます。

K-MeansアルゴリズムとMean-Shiftの違いは、クラスターの数はアルゴリズムwrtデータによって決定されるため、後でクラスターの数を事前に指定する必要がないことです。

平均シフトアルゴリズムの動作

次の手順を使用して、平均シフトクラスタリングアルゴリズムの動作を理解できます。

  • Step 1 −まず、独自のクラスターに割り当てられたデータポイントから始めます。

  • Step 2 −次に、このアルゴリズムは重心を計算します。

  • Step 3 −このステップでは、新しい図心の位置が更新されます。

  • Step 4 −ここで、プロセスが繰り返され、高密度領域に移動されます。

  • Step 5 −最後に、重心がそれ以上移動できない位置に到達すると停止します。

Pythonでの実装

Mean-Shiftアルゴリズムがどのように機能するかを理解するのは簡単な例です。この例では、最初に4つの異なるblobを含む2Dデータセットを生成し、その後、平均シフトアルゴリズムを適用して結果を確認します。

%matplotlib inline
import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
from sklearn.datasets.samples_generator import make_blobs
centers = [[3,3,3],[4,5,5],[3,10,10]]
X, _ = make_blobs(n_samples = 700, centers = centers, cluster_std = 0.5)
plt.scatter(X[:,0],X[:,1])
plt.show()
ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
colors = 10*['r.','g.','b.','c.','k.','y.','m.']
for i in range(len(X)):
    plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 3)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
    marker=".",color='k', s=20, linewidths = 5, zorder=10)
plt.show()

出力

[[ 2.98462798 9.9733794 10.02629344]
[ 3.94758484 4.99122771 4.99349433]
[ 3.00788996 3.03851268 2.99183033]]
Estimated clusters: 3

長所と短所

利点

以下は、平均シフトクラスタリングアルゴリズムのいくつかの利点です。

  • K-meansやガウス混合のようにモデルを仮定する必要はありません。

  • また、非凸形状の複雑なクラスターをモデル化することもできます。

  • クラスターの数を自動的に決定するbandwidthという名前のパラメーターが1つだけ必要です。

  • K-meansのように極小値の問題はありません。

  • 外れ値から生成された問題はありません。

短所

以下は、平均シフトクラスタリングアルゴリズムのいくつかの欠点です。

クラスターの数が急激に変化する高次元の場合、平均シフトアルゴリズムはうまく機能しません。

  • クラスターの数を直接制御することはできませんが、一部のアプリケーションでは、特定の数のクラスターが必要です。

  • 意味のあるモードと意味のないモードを区別することはできません。