10

scikit の dbscan アルゴリズムを実行しているときにメモリ エラーが発生しました。私のデータは約 20000*10000 で、バイナリ マトリックスです。

(このような行列で DBSCAN を使用するのは適切ではないかもしれません。私は機械学習の初心者です。最初のクラスター番号を必要としないクラスター メソッドを見つけたいだけです)

とにかく、scikit の疎行列と特徴抽出を見つけました。

http://scikit-learn.org/dev/modules/feature_extraction.html http://docs.scipy.org/doc/scipy/reference/sparse.html

しかし、私はまだそれを使用する方法がわかりません。DBSCAN の仕様では、疎行列の使用についての指示はありません。許可されていませんか?

DBSCAN で疎行列を使用する方法を知っている人がいたら教えてください。または、より適切なクラスター メソッドを教えてください。

4

4 に答える 4

8

scikit残念ながら、DBSCANの実装は非常に単純です。インデックス (ボール ツリーなど) を考慮して書き直す必要があります。

現時点では、完全な距離行列を計算する必要があるようで、大量のメモリが浪費されます。

DBSCAN を自分で再実装することをお勧めします。かなり簡単です。ウィキペディアや元の出版物などに、優れた疑似コードが存在します。ほんの数行で済むので、データ表現を簡単に活用できます。たとえば、疎な表現で類似度グラフが既にある場合、通常、「範囲クエリ」を実行するのはかなり簡単です (つまり、距離のしきい値を満たすエッジのみを使用します)。

これは、実装の改善について話しているscikit-learn github の問題です。ユーザーは、ボールツリーを使用したバージョンが 50 倍高速であると報告しています (これは驚くことではありません。以前にインデックスで同様の高速化を見たことがあります。データセットのサイズをさらに大きくすると、より顕著になる可能性があります)。

更新: scikit-learn の DBSCAN バージョンは、この回答が書かれてから大幅に改善されました。

于 2013-05-25T12:36:39.293 に答える
1

はい、バージョン 0.16.1 以降です。テストのコミットは次のとおりです。

https://github.com/scikit-learn/scikit-learn/commit/494b8e574337e510bcb6fd0c941e390371ef1879

于 2016-08-18T13:02:13.897 に答える
1

に距離行列を渡すことができるため、 がサンプル行列であるとDBSCAN仮定すると、次のように動作するはずです。X

from sklearn.metrics.pairwise import euclidean_distances

D = euclidean_distances(X, X)
db = DBSCAN(metric="precomputed").fit(D)

ただし、行列は: ² エントリDよりもさらに大きくなります。疎行列では、k-means がおそらく最良のオプションです。Xn_samples

(事前に決められた数のクラスターを必要としないため、DBSCAN は魅力的に見えるかもしれませんが、調整する必要がある2 つのパラメーターと引き換えに、サンプルが空間内のポイントであり、どれだけ近いかを知っている設定で主に適用されます。これらのポイントを同じクラスターに配置したい場合、または scikit-learn がサポートしていないブラック ボックス距離メトリックがある場合)。

于 2013-04-19T12:56:43.600 に答える
0

Sklearn の DBSCAN アルゴリズムはスパース配列を取りません。ただし、KMeansSpectral クラスタリングはそうです。これらを試すことができます。sklearns クラスタリング方法の詳細: http://scikit-learn.org/stable/modules/clustering.html

于 2013-04-19T06:57:17.063 に答える