2017-08-01 5 views
0

sklearnのDBSCAN実装を使用したいと思います。カスタム距離メトリックを使用できますが、値はepsです。 私が欲しいのは以下の通りです:sklearnの複数のeps値DBSCAN

私のポイントはそれぞれ3つのフィーチャーを持っていると言いますが、各ポイントはフォームp=np.array([p1,p2,p3])のnumpy配列と考えることができます。 np.abs(p1-q1) < eps1np.abs(p2-q2) < eps2np.abs(p3-q3) < eps3の場合、2つの点pqが隣接しています。通常、を使用します(d(,)はメトリックで、しきい値を設定します)。

私のニーズを簡単にSklearnに実装する方法はありますか?

答えて

1

適切に縮尺を変え、最大のノルムを使用することができます。

p = p * [1/eps1, 1/eps2, 1/eps3] 

c = sklearn.cluster.DBSCAN(eps=1, metric="chebyshev", ...) 

DBSCANが<=ない<を使用することに注意してください。

または、3つの条件が成立すると距離が0になるバイナリ "距離"行列を事前計算します。そうでない場合は1になります。しかし、それにはO(n²)のメモリが必要です。

+0

この距離行列は、私の場合は疎です。それを利用してメモリ使用量を減らす方法はありますか?しかし、スケーリングのアイデアは美しいだけです!ありがとう! – Merlin1896

+1

0.17 sklearnはスパース距離行列を使用できます。しかし、1を保存するのではなく、0を保存する必要があることに注意してください。欠損値は無限であるとみなされます。スケーリングのアプローチがスパース行列より高速であることがわかっても驚くことはありません。 –

+0

[ELKI](https://elki-project.github.io/)では、この事前重み付けハックを使わずに距離関数を定義してインデックスアクセラレーションを得ることができます(本チュートリアル(https:// elki-project.github.io/tutorial/spatial_distance_functions)に加重距離で入力します)。しかし、それでも以前の重み付けは、すべての距離計算に重みを適用するよりもわずかに速いかもしれない。 –

関連する問題