2012-02-18 12 views
1

私は大きな点集合をクラスタリングしています。反復を通じて、割り当てられたポイントが以前の反復と同じであれば、クラスタプロパティの再計算を避けたいと思います。各クラスタはそのポイントのIDを保持します。私はそれらの要素を賢明に比較したくない、IDのベクトルの合計を比較することは危険である(小さいIDは大きなもので補うことができる)、私は平方和を比較すべきか?私が自信を持って使うことができるMatlabにハッシュ法がありますか?ベクトルの線形インデックスのためのMatlabのハッシュ演算子

例データ:

a=[2,13,14,18,19,21,23,24,25,27] 

b=[6,79,82,85,89,111,113,123,127,129] 

c=[3,9,59,91,99,101,110,119,120,682] 

d=[11,57,74,83,86,90,92,102,103,104] 

だから、問題は、私はちょうどサムをチェックすると、それは例えば、そのクラスタdの可能性があること、ポイント11103を失い及び9105を取得しています。そうすれば、私は誤ってクラスターに変化がないと思うでしょう。

+1

サンプルデータを提供できますか? – Alex

+0

私はMatlabのハッシュには自信がありません。このような比較のために、ismemberやsetdiffのようなセット操作は強力に見えます。パフォーマンスを心配するならば、長さを比較するだけで、ほとんどの変更されたセットを取り除くことができると思います。あるいは、最初のテストとしてランダムな要素があるとします。 – bdecaf

+0

ご意見ありがとうございます。 Setdiffは本当に遅く、ランダムな要素をチェックすることも危険です。なぜなら、クラスターが収まるにつれて、いくつかのポイントを得る/緩めるからです。ポイントIDをランダムに選ぶと、私はそれらを見逃してしまう可能性があります。 – zamazalotta

答えて

0

私はこの関数を見つけました DataHash on FEXベクトルのためには静かで高速ですし、キーのstrcmpは私が予想したよりもはるかに高速です。

+0

*私はこの中にJavaを入れたくありません。* [DataHash](http://www.mathworks.com/matlabcentral/fileexchange/31272-datahash)はjavaを使用しています。実際には、macduffが提案したメソッド(165行目を参照): 'Engine = java.security.MessageDigest.getInstance(Method);') – embert

0

私はIDをハッシュするために、正しく理解していれば、私はあなたが何かやる

http://docs.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html

Javaのハッシュアルゴリズムを使用してMATLAB Javaインタフェースを使用することをお勧めします:

hash = java.security.MessageDigest.getInstance('SHA'); 

をお役に立てれば。

+0

私はJavaにこれをやって欲しくないのですが、その理由の一部はオーバーヘッドであり、また私は高価な文字列比較を行う必要があります。私はいくつかの数値比較を行うために現在のIDベクトルを使用したいと思います。 – zamazalotta

1

これは、私たちがあなたのデータとアプリケーションについてもっと知っているほど、私たちが助けることができるようになった(非常に一般的な)状況の1つです。あなたが提供するよりも優れた情報がない場合、そのような不在時にこのような答えの弱点を露呈させる精神の中で、あなたが拒絶するかもしれない提案がいくつかあります。

セット操作の適切なデータ構造の1つは、ビットセットです。これは、(ビットのセットに基づいて各ビットがオンまたはオフに設定される基本的なユニバースのカーディナリティに等しい長さのセットです。サブセット)。

a)(簡単ですが、余りにも多くのスペースを消費することがあります):データ内の点数と同じ数の行列と各クラスターごとに1行の行列を定義します。 pointがclusterのメンバーであれば、(cluster、point)の値をtrueに設定します。セット操作は、ベクトル操作によって定義されます。私はsetdiffとrowA == rowBの相対(時間)効率についての手がかりを持っていません。

b)(より困難):実際にはビットセットごとにクラスタを表します。もちろん、Matlabのビットtwiddling機能を使用する必要がありますが、痛みは利益の価値があるかもしれません。ユニバースが1024ポイントで構成されていると仮定すると、各クラスタに設定されたビットを表すために16個のuint64値の配列が必要です。クラスタ内のポイント563が存在すると、そのクラスタを表すビットセットに対してビット563(おそらくセットの9番目の要素のビット51)が1に設定されている必要があります。

おそらくI私はこれが問題のハッシングのようなものだとは思わないと書いて始めなければなりませんでした、それは一連の問題です。ええ、あなたはハッシュを使うことができますが、釘のドライバーを使うことの限界をプログラムしなければなりません。

+0

返事をありがとう。しかし、私はまだ私の問題がハッシングの問題だと考えています。私は明確にしようとしましょう。私のデータは、3Dで60K点で構成されています。私は、K平均クラスタリングのカスタムバージョンを実装しています。クラスターに最も近いポイントを計算すると、これらのポイント、統計分布などに基づいてクラスターのいくつかのプロパティーを計算します。これは計算上重い。ですから、それを避けるために、最後の繰り返しと同じ点をクラスター内に持っているかどうかを知りたいのです。現在、私は3D座標の平均を比較しています。より速いものを探しています。 – zamazalotta

関連する問題