web-dev-qa-db-ja.com

未知の数のクラスターを使用した教師なしクラスタリング

3次元のベクターセットが多数あります。ユークリッド距離に基づいてこれらをクラスタリングし、特定のクラスター内のすべてのベクトルが相互のユークリッド距離がしきい値「T」未満になるようにする必要があります。

クラスターの数はわかりません。最後に、そのユークリッド距離が空間内のベクトルのいずれかと「T」以上であるため、クラスターの一部ではない個々のベクトルが存在する場合があります。

ここで使用する既存のアルゴリズム/アプローチは何ですか?

68
London guy

階層的クラスタリング を使用できます。これはかなり基本的なアプローチであるため、多くの実装が利用可能です。たとえば、Pythonの scipy に含まれています。

たとえば、次のスクリプトを参照してください。

import matplotlib.pyplot as plt
import numpy
import scipy.cluster.hierarchy as hcluster

# generate 3 clusters of each around 100 points and one Orphan point
N=100
data = numpy.random.randn(3*N,2)
data[:N] += 5
data[-N:] += 10
data[-1:] -= 20

# clustering
thresh = 1.5
clusters = hcluster.fclusterdata(data, thresh, criterion="distance")

# plotting
plt.scatter(*numpy.transpose(data), c=clusters)
plt.axis("equal")
title = "threshold: %f, number of clusters: %d" % (thresh, len(set(clusters)))
plt.title(title)
plt.show()

次の図のような結果が生成されます。 clusters

パラメータとして指定されるしきい値は、ポイント/クラスターを別のクラスターにマージするかどうかの判断に基づいた距離値です。使用されている距離メトリックも指定できます。

クラスター内/クラスター間の類似性を計算する方法にはさまざまな方法があることに注意してください。最も近いポイント間の距離、最も遠いポイント間の距離、クラスターの中心までの距離など。これらのメソッドの一部は、scipys階層クラスタリングモジュールでもサポートされています( single/complete/average ... linking )。あなたの投稿によると、 完全なリンケージ を使用したいと思うと思います。

このアプローチでは、他のクラスターの類似性基準、つまり距離のしきい値を満たさない場合、小さな(単一ポイント)クラスターも許可されることに注意してください。


パフォーマンスが向上する他のアルゴリズムがあります。これは、多くのデータポイントがある状況で関連します。他の回答/コメントからわかるように、DBSCANアルゴリズムもご覧ください。


これらおよびその他のクラスタリングアルゴリズムの概要については、(Pythonのscikit-learnライブラリの)このデモページも参照してください。

その場所からコピーされた画像:

http://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html

ご覧のとおり、各アルゴリズムは、考慮する必要があるクラスターの数と形状についていくつかの仮定を行います。アルゴリズムによって課せられた暗黙の仮定であれ、パラメータ化によって指定された明示的な仮定であれ。

72
moooeeeep

Moooeeeepによる答えは、階層的クラスタリングの使用を推奨しました。 chooseクラスタリングのしきい値について詳しく説明したかった。

1つの方法は、異なるしきい値に基づいてクラスタリングを計算することですt1t2t、...そして、「品質」のメトリックを計算しますクラスタリングの。前提は、最適クラスター数のクラスタリングの品質には、品質メトリックの最大値が含まれることです。

過去に使用した質の高いメトリックの例は、Calinski-Harabaszです。簡単に説明すると、クラスター間の平均距離を計算し、それらをクラスター内距離で除算します。最適なクラスタリングの割り当てには、互いに最も分離されたクラスターと、「最もタイトな」クラスターがあります。

ところで、階層的なクラスタリングを使用する必要はありません。 k-meansのようなものを使用して、各kごとに事前計算し、Calinski-Harabaszスコアが最も高いkを選択することもできます。 。

さらに参照が必要な場合はお知らせください。いくつかの論文のためにハードディスクを精査します。

21
Max

[〜#〜] dbscan [〜#〜] アルゴリズムを確認してください。ベクトルの局所密度に基づいてクラスター化します。つまり、それらはεの距離を超えてはならず、クラスターの数を自動的に決定できます。また、外れ値、つまりε-neighborsの数が不十分なポイントはクラスターの一部ではないと見なします。ウィキペディアのページは、いくつかの実装にリンクしています。

11
Fred Foo

[〜#〜] optics [〜#〜] を使用します。これは、大規模なデータセットで適切に機能します。

OPTICS:DBSCANに密接に関連するクラスタリング構造を識別するための順序点は、高密度のコアサンプルを見つけ、それらからクラスターを展開します 1 。 DBSCANとは異なり、可変近隣半径のクラスター階層を保持します。 DBSCANの現在のsklearn実装よりも、大規模なデータセットでの使用に適しています

from sklearn.cluster import OPTICS
db = DBSCAN(eps=3, min_samples=30).fit(X)

要件に応じてeps、min_samplesを微調整します。

0
Ravindra babu