2

私はDBSCANのようなクラスタリングアルゴリズムを使用しています。sklearn:ポイントから最寄りのクラスタまでの距離を取得

-1と呼ばれる「クラスタ」を返します。これらのポイントは、クラスタの一部ではありません。これらの点については、この点がどのように異常であるかの指標のようなものを得るために、その点から最も近いクラスターまでの距離を求めたいと思います。これは可能ですか?または、この種のメトリックの代替手段はありますか?

+1

どのようにしてクラスタとの距離を測定しますか?多くのオプションがあります:単一リンケージでは、クラスターまでの距離は最も近いメンバーまでの距離です。完全なリンケージは、それが一番遠いメンバーとの距離だと言います。平均的なリンケージ、ワードのリンケージがあります...あなたは何のために行くのですか? –

+1

私の最初の直感は、「単一リンケージ」は良いメトリックのように聞こえて、私が心に留めていたことです。しかし、さまざまな測定基準があることを知って、これはありがとう。 – ScientiaEtVeritas

+0

私が正しく理解していれば、ノイズの多いポイントからクラスタの最も近いポイントまでの距離を決定したいと思うのです(あなたは一度のリンケージを使用しているので)?もしそうなら、あなたは[sklearn.metrics.pairwise.euclidean_distances](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.euclidean_distances)でノイズポイントとクラスタポイント間のユークリッド距離を計算することができます。 html)。ユークリッド距離は、DBSCANで使用される最も一般的な距離メトリックでもあるため、うまくいくはずです。 – umutto

答えて

3

回答は、選択したリンケージ戦略によって異なります。私は単一のリンケージの例を挙げます。

まず、データの距離行列を構築できます。

for point in unclustered_points: 
    distances = [] 
    for cluster in clusters: 
     distance = dist_matrix[point, cluster].min() # Single linkage 
     distances.append(distance) 
    print("The cluster for {} is {}".format(point, cluster) 

EDIT:

from sklearn.metrics.pairwise import pairwise_distances 
dist_matrix = pairwise_distances(X) 

その後、あなたは最も近いクラスタ抽出します。この作品を、それはO(N^2)Anony-ムースで指摘したようです。あなたの仕事を削減するので、コアポイントを考えることがより良いアイデアです。さらに、それは重心リンケージに幾分類似している。

+0

これは不要な多くの距離を計算するため、非常に遅いです。また、O(n²)メモリを使用し、大きなデータセットでは機能しません。 –

1

DBSCANの直感に近づくには、おそらくコアポイントのみを考慮する必要があります。

コアポイントを最も近いネイバーサーチャに配置します。その後、すべてのノイズポイントを検索し、最も近いポイントのクラスタラベルを使用します。

関連する問題