高次元データのクラスタリング


8

TL; DR:ラベル付けされていないデータの大きな画像データセット(生のピクセルが約36 GiB)がある場合、K最初にクラスターの数を知らずに(ピクセル値に基づいて)画像をクラスター化するにはどうすればよいですか?

私は現在、画像をクラスター化するための教師なし学習プロジェクトに取り組んでいます。16x16x3のRGBピクセル値でMNISTをクラスタリングすると考えてください。クラスタリングする必要があるのは約4800万の例だけです。それらのアイデンティティを知らなくても、一部の画像は同じソースからのものであるため、確実に関連していることはわかりますが、たとえばK、セットでK平均法を「ただ」実行するための適切な方法もまだわかりません。

t-SNEを使用して手動の2D埋め込みを実行し、埋め込みスペースで手動でクラスター化することを考えていました(16x16x3-d で手動で実行するよりも簡単なタスク)。ただし、すべてのt-SNE実装で、データをメモリにロードする必要がありました。最初にt-SNEを実行し、次にt-SNE埋め込みデータでK-meansを実行することも考えましたが、MNISTからのt-SNEの結果を見ると、これらのクラスターが歪んでいる可能性があり、歪んでいる可能性があることは明らかです非線形の方法で。したがって、私がを知っていたKとしても、クラスターはおそらく分割されます。K平均にマハラノビス距離を使用することは興味深いかもしれませんが、そもそも共分散がわからないので、これも行き止まりのようです。

現在、サンプルでPCA圧縮を実行して、少なくともt-SNEのメモリをいくらか取り戻すことができるかどうかを試していますが、それが機能する場合と機能しない場合があります。

誰かが私にこれを行うための正しい方向へのポインタを与えることができますか(理想的には、Python、TensorFlow、またはApache Beam / Dataflowコンテキストでは必ずしも必要ではありません)?私は少し前にストリーミング/ボールK-meansの移植に取り組んでいましたが、「オンデマンド」で新しいクラスターを作成するという優れた特性がありますが、それをPython / TensorFlow / Dataflowに再び実装する前に、誰かができることを望んでいましたどこから始めるべきか、何を避けるべきか、いくつかのアイデアを教えてください。


k-meansに設定されていますか?必要なクラスターの数がわからない場合は、階層的な方法を使用してみませんか?
MissMonicaE 2017年

1
@MissMonicaE k-meansはまったく設定されていません。最初に思いついたのです。この文脈で意味のある階層的な方法を教えてもらえますか?
2017年

1
残念ながら、私が精通している唯一のアルゴリズムはAGNESとDIANAであり、これらは非類似度行列を取ります(まあ、Rパッケージは生データを取りますが、画像が機能するかどうかはわかりません-プレーンな数値データをクラスター化したことはありません)。
MissMonicaE 2017年

2
密度ベースの方法を試してください。これらはk平均よりもヒューリスティックではありません。おもちゃの問題で、データが厳密に正規分布からのものである場合にのみ、k平均法を使用します。stats.stackexchange.com/questions/133656/…を
Jon

回答:


11

私は考えていない任意のそのような規模でのクラスタリング技術「単なる」仕事のを。最もスケーラブルなのは、おそらくk-means(Spark / Mahoutを使用しないでください。これらは本当に悪いです)とDBSCAN(いくつかの優れた分散バージョンが利用可能です)です。

しかし、クラスタリングは難しいため、スケール以外にも多くの課題直面します。アルゴリズムを実行するだけで十分であり、クラスターが存在するわけではありません。クラスタリングは探索的な手法です。「正しい」クラスタリングはありません。ただし、クラスタリングを何度も実行して、すべてのクラスタを確認する必要があります。そこにあるためだろう、すべての権利を取得し、単一のパラメータ設定ではありません。代わりに、異なるクラスターが異なるパラメーターでのみ表示される場合があります。

しかし、あなたの場合の主な課題は、おそらく距離関数です。MNISTのような理想的な設定を除いて、ユークリッド距離はまったく機能しません。また、生のピクセルには何も作用しません。したがって、最初に特徴抽出を行い、次に類似度関数を定義する必要があります。

クラスタリングに関しては、サンプルを使用してください。サンプルクラスタ、興味深いクラスタを識別その後、あなたの全体のデータセットにラベルを一般化する方法を考えます。たとえば、分類によって(ラベル付きデータポイントはトレーニングセットであり、ラベルなしポイントのラベルを予測します)。


0

次元削減を行う場合は、Mahoutを使用する必要があります。これはクラス最高であり、真に分散されたバージョンのPCA / SVDを提供する唯一のオープンソースプロジェクトです。

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/algorithms/linear-algebra/d-spca.html

http://mahout.apache.org/docs/0.13.1-SNAPSHOT/algorithms/linear-algebra/d-ssvd.html

Mahoutには、DBSCAN実装、Google Summer of Codeプロジェクトの一部としてWIPもあり、注目に値します。

Anonyの「Mahout is Bad」の発言(Sparkはそうだと思います)は非推奨のMapReduceバージョンのMahoutに関連していると思います(新しいバージョンでは、K-Meansはまだ箱から出して実装されていませんが、これをかなり簡単に行う方法についてのメーリングリスト)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.