8

sklearn.clustering.DBSCAN への入力を前処理する必要がありますか?

http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-pyでは、入力サンプル X 間の距離が計算され、正規化されます。

D = distance.squareform(distance.pdist(X))
S = 1 - (D / np.max(D))
db = DBSCAN(eps=0.95, min_samples=10).fit(S)

v0.14 の別の例 ( http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html ) では、いくつかのスケーリングが行われます。

X = StandardScaler().fit_transform(X)
db = DBSCAN(eps=0.3, min_samples=10).fit(X)

後者の例に基づいてコードを作成し、このスケーリングでインプレッション クラスタリングがより適切に機能するようにしました。ただし、このスケーリングは「平均を取り除き、単位分散にスケーリングすることで特徴を標準化します」。2d クラスターを見つけようとします。クラスタを正方形の領域に分散させた場合、たとえば 100x100 としましょう。スケーリングに問題はありません。ただし、800x200 などの長方形の領域に分布している場合、スケーリングによってサンプルが「圧縮」され、サンプル間の相対距離が 1 次元で変更されます。これはクラスタリングを悪化させますよね?または、私は理解していますか?違う?なんらかの前処理を適用する必要がありますか、それとも単に「生」データを入力するだけでよいですか?

4

1 に答える 1

15

それはあなたがしようとしていることに依存します。

地理データで DBSCAN を実行し、距離がメートル単位である場合、おそらく何も正規化する必要はありませんが、イプシロンのしきい値もメートル単位で設定します。

はい、特に不均一なスケーリング距離を歪めます。歪みのないスケーリングは、異なるイプシロン値を使用することと同じですが!

最初の例では、明らかに距離行列ではなく類似度が処理されることに注意してください。類似度行列を非類似度行列に変換するヒューリスティックです。Epsilon 0.95 は事実上、最大で「観測された最大非類似度の 0.05」を意味します。同じ結果が得られる代替バージョンは次のとおりです。S = (1 - D / np.max(D))

D = distance.squareform(distance.pdist(X))
S = np.max(D) - D
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S)

2 番目の例では、距離行列ではなく、生の入力データfit(X)を実際に処理します。このようにメソッドをオーバーロードするのは醜いハックです。便利な反面、誤解や間違った使い方をしてしまうこともあります。

全体として、私は sklearn の DBSCAN をレファレンとして使用しません。API 全体は、クラスタリングではなく、分類によって大きく左右されるようです。fit通常、クラスタリングは行わず、教師ありメソッドに対してのみ行います。さらに、sklearn は現在、高速化のためにインデックスを使用しておらず、O(n^2)メモリを必要とします (DBSCAN では通常は必要ありません)。

一般に、距離が機能することを確認する必要があります。距離関数が機能しない場合、距離ベースのアルゴリズムは望ましい結果を生成しません。一部のデータ セットでは、最初にデータを正規化するときに、ユークリッドなどの単純な距離が適切に機能します。他のデータ セットでは、距離とは何かをよく理解しています (たとえば、地理データ。これを標準化することは明らかに意味がなく、ユークリッド距離も意味がありません!)。

于 2013-07-04T07:38:17.337 に答える