スパースベクトルを使用して非常に高次元の空間で近接ペアを見つける


9

私が持っている(〜百万)の特徴ベクトルを。ありますM(〜百万)バイナリの機能は、しかし、各ベクトルのみにKになり、それらの(〜千)1、残りはある0を。少なくともL(約100)の特徴が共通する(両方に1つある)ベクトルのペアを探しています。このようなペアの数は、N(約100万)と同程度です。NMK10L1N

これは、非常に高次元の空間で近接する点のペアを探すことで解決できると思います。距離関数は、2つのベクトルに共通する特徴の数に基づいたものにすることができます。しかし、おそらくこれは、より一般的な距離メトリック(ユークリッドなど)でも役立ちます。

この問題に取り組むのに役立つ有名なアルゴリズムはどれですか?Nまたは 2次式はM実用的ではありません。


問題の実際の定式化の例は、複数の場所の間を移動するN人を考慮することです。2人が同時に同じ場所にいた場合、彼らはお互いに会ったと言います。(少なくとも1人が存在する場所と時間の組み合わせの数はMです。)私たちは友達を探しています:少なくともL回会った人。


1
ベクトル1、特徴1が、ベクトル2、特徴1も0の場合、その特徴は「共通」ですか?00
ガン-モニカ

@ user777、私はノーと仮定します。その場合、あなたの答えは完璧ですが、これがOPによって明示的に述べられているとよいでしょう。
ガン-モニカ

@gung、あなたは正しいと思います。明確にするために質問を編集しました。ありがとう!
ダニエルダラボス2015

1
いくつのペアのベクトルが100を超える機能を共通に持っているか-ランダムなサンプル+総当たり?1M x 1Mのサイズは実際の問題ですか、それとも問題ですか stackoverflowのbit-string-nearest-neighbour-searchingのアプローチも参照してください。
denis

1
おそらくおかしな提案:1 Mビット長の特徴ベクトルを1000 x 1000ピクセルの画像として表示し、画像のクラスタリングの方法を調べます(例:stackoverflow.com/search?q=[ image]+clustering)。Afaikが機能するには、優れた機能(単一ピクセルではない)を見つける必要がありますが、私は専門家ではありません。
denis

回答:


6

あなたが探しているアプローチは、minhashシグネチャとLocality Sensitive Hashing(LSH)の組み合わせのようです。マイニング大規模データセットの(無料で入手可能な)pdfは、このアプローチ(およびその他の類似性測定)を第3章で少し詳しく説明していますが、簡単に説明します。

minhash署名は、いくつかの数の適用によって構成されている元の行列の圧縮表現であり、nは、それにより観察あたりの特徴の数を減らす、フィーチャにハッシュ関数を。これによりデータのサイズが小さくなりますが、おそらく問題が残っていることに気付くでしょう。O(N2)

これに対処するために、MMDSは、検索するすべてが特定の類似性のしきい値を超えるペアである場合(これはあなたのケースに当てはまるようです)、類似している可能性が最も高いペアのみに焦点を当てることができます-このアプローチはLocality Sensitive Hashingと呼ばれ、セクション3.4では、minhash署名アプローチをLSHと組み合わせる方法の例を紹介します。

本文の他に、同名のコースラ講座での講義もあります。


7

L

L1L(N2)

近接しているポイントを見つけることは、実際にクラスタリングの問題です。しかし、私が精通しているクラスタリングアルゴリズムの最初のステップは、ペアワイズ距離または類似性の計算です。私は誰かがより効率的な代替案を開発したと確信しています。用語に関するポイント:少なくとも共通の近傍を持つことは、距離ではなく、類似度と表現されます!この場合、内積は正規化されていないコサイン類似点です。L

観測の特徴ベクトル(この場合はノルムと同じ)の合計がより大きい場合にのみ内積計算を実行することで、これを扱いやすくすることができます。これは、そのバイナリ特徴ベクトルでは不可能だからです。この合計がより小さい場合に私の基準を満たす別のバイナリ特徴ベクトルとの内積を得る。明らかに、これらの合計の計算は複雑さだけなので、内積ステップの大きさを下げるための安価な方法です。L O N L1LO(N)

しかし、この問題の範囲を減らす古典的な方法は、追加の事前フィルタリングを行うことです。あまり一般的でない機能が値1をとる場合に特に関心がありますか?その場合、それらの特徴ベクトルの計算のみを実行します。

または、問題を再フレーミングすることでメリットを得られるかもしれません。たとえば、サンプリングには優れた特性があることが知られています。推論統計は、この考えにかなりの深さで発展します。したがって、データセット全体を分析することは不可能かもしれませんが、小さなサンプルを調べることは完全に可能です。どのような質問に答えようとしているのかはわかりませんが、実験を注意深く設計すると、数千の観測のみを確認して、検証目的で十分なデータが残っていることになります。

さらに考えた結果、作業しているデータはある種のグラフであるという強い直感があります。がいくつかの接続されたコンポーネントで構成されていることは非常にあり得ます。その場合、を一連のグラフに分解して、データの次元数を減らすという楽しい副作用をもたらすことができます。グラフがほぼ同じサイズの2つの接続されたコンポーネントのみであっても、ペアごとの比較の合計コストはおよそです。G G O N 21GGGO(N2)14

グラフが対称である場合、次の観察が役立つ場合があります。

  1. 以下のように、グラフのラプラシアンを定義する、度の対角行列(各特徴ベクトルの和)であり、隣接行列(マトリクスに特徴ベクトルのスタッキング)です。D AP=DADA
  2. 数回の固有値として現れるの連結成分の数であり、。グラフを接続されたコンポーネントに分解し、それらのコンポーネントのみで作業すると、データの次元が減少するという副作用があります。関心の量を計算することは簡単になります。しかし、固有分解の計算は、100万の頂点ではコストがかかります...0PG
  3. (完全な置換の後)は、接続されたコンポーネントのラプラシアンのブロック対角行列です。PG
  4. Pは正の半定値です。これはほぼ確実に何らかの形で役立ちます。
  5. の代数的連結性は、 2番目に小さい固有値の値です。これにより、がどれほど適切に接続されているかがわかります。おそらく、re:共通の機能を持つベクターに興味があるいくつかの質問に答えることでしょう。スペクトルグラフ理論は、このアイデアをさらに詳細に発展させます。GPG

「これはSNAの問題ですか?」よく分かりません。1つのアプリケーションでは、機能は動作を説明し、同様の動作を持つ人々をつなぐことを目指しています。これはSNAの問題ですか?

人と行動を結びつける2部グラフがある場合、これをアフィリエーションネットワークと考えることができます。人は行、行動は列です。人々の共通の振る舞いを介して人々をつなぎたい場合は、計算できます。は、人々が共通して持っている行動の数です。明らかに、があなたの質問に答える頂点のセット。B B T = A A I J A 、I 、JLBBBT=AAijAijL


すばらしい答えをありがとう!それは私がさらに調査しなければならない多くのことです。しかし、ペアごとの比較が避けられないと私は確信していません。これは、サイズが1より大きいクラスターを探しているところのクラスター化の問題ではないですか?いくつかの空間分割アプローチがペアワイズ比較の数を大幅に削減できると期待していました。
ダニエルダラボス2015

申し訳ありませんが、データサイエンスについてはあまり知りません。しかし、互いに近くにあるポイントを一緒にグループ化しようとするとき、それはクラスタリングの問題ではありませんか?最大距離(L)があり、互いにその距離内にあるポイントのグループ(ペア)を見つけたい。クラスタリングの定義を拡張しすぎていますか?
ダニエルダラボス

1
それは確かにグラフの問題として表現できます。その場合、N個の点とM個の特徴の2部グラフがあり、少なくともL個の共通の近傍を持つ点のペアを見つけたいと考えています。私は特に、特徴ベクトルベースのフレージングに注目しています。これは、私に役立つクラスタリング方法があることを期待しています。K-SVDはstats.stackexchange.com/questions/93366/…で同様の問題が提案されたので、現時点ではそれについて読んでいます。ありがとう!
ダニエルダラボス

「これはSNAの問題ですか?」よく分かりません。1つのアプリケーションでは、機能は動作を説明し、同様の動作を持つ人々をつなぐことを目指しています。これはSNAの問題ですか?用語を紹介していただきありがとうございます。検索の参考にしてください。
ダニエルダラボス

回答を修正しました。あなたの最終的な目標は、多くの共通の行動を持つ人々を列挙することだけですか、それとも別のものですか?
Sycoraxは、モニカを2015

2

時空間ブロックで出会う人を探す場合:
空間をブロック(都市ブロック、平方kmなど)に、時間をブロックにます。人々が会った場合、彼らは同じブロック内で会う可能性が高いです。 したがって、各ブロック内でNNを実行します。ランタイムとエラー率はもちろんブロックサイズと形状(並列化できるものやMapReduceにも依存します)に依存しますが、操作するパラメータがあります-エンジニアリング、ワイドオープンではありません。NspaceNtime
O(N2)

参照:datascience.stackexchangeの
nearest-neighbors-search-for-very-high-dimension-data

pairwise.py

Python Gensimライブラリと標準ライブラリのheapqを使用して、TF-IDFと余弦距離を使用して、非常に多くのドキュメントを非常に高速でスケーラブルなペアワイズ比較します。


1

逆辞書!ポイントをとしてゼロ以外の値(つまり、特徴がtrueに対応する)に対応するキーです。要素のストレージの平均サイズはます。確かに、フィーチャを格納するための文字列と、値を保持するための浮動小数点のみが必要です。xfeat1:value1,feat101:value101KKK

各機能について、この機能を共有するインデックスを保持する辞書を作成します。うまくいけば、この数はあまり大きくなりません(すべてのインデックスで共有される機能がある場合、このアプローチは台無しになり、ここで読むのをやめることができます)。

この辞書は、次のようになります。速度を上げてスペースを節約したい場合は、1つの要素(ここでは)でのみ検出される機能を削除することもできます。これらの機能は近接ペアを生成しないためです。この辞書は操作に組み込まれています。feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)

さて、あなたは要素の距離評価したいとき他の人には、(辞書)を有する少なくとも一つの特徴を共有インデックスのリストを生成。他のすべての要素はから離れていることを知っています(1つの機能さえ共有していません!)。「機能ごとの要素」の平均数が少ない場合(と呼びます)、である必要はありません。x x P O N 2xxxPO(N2)

演算では、およびキーを反復してまたはを評価できるためおよびも辞書として表される場合、もう1つの大きな改善があります。y d x y < x y > x y O K xyd(x,y)<x,y>xyO(K)

最終的な複雑さは、単純な初期アプローチではなく、です。O M N 2O(NPK)O(MN2)

この方法を適用して、大規模なテキストセット(トレーニング:20000 000行、テスト35 000行、機能数:10 000、要素あたりの平均機能数:20)にKNNを実装しました。これは約1時間で実行されました。 。


私はこのアプローチを完全に理解していません-これは私があなたを信じないからではありません。それは、データを表すためのさまざまな戦略に精通していないためです。おそらく、最初の2つの段落でカバーする内容について詳しく説明できますか?
Sycorax氏は、モニカを2015

1)「この数値は大きすぎません」:平均列合計=平均行合計=1000。2)浮動小数点数?OPの機能はバイナリです。3)3回の実行のランタイムN、2N、4Nは興味深いもので、おおよそかどうかを示します。O(N2)
denis

1

参考になると思われる参考資料を見つけました。これは、これまでに紹介した他のどのソリューションよりも漸近的に効率的だと思います。私が正しく理解していれば、時間で最近傍(KNN)グラフを作成でき。O L N log N kO(LNlog(N))

L. Erotz、M。Steinbach、およびV. Kumar。「新しい共有最近隣クラスタリングアルゴリズムとそのアプリケーション。」高次元データのクラスタリングとそのアプリケーションに関する第1回ワークショップの議事録、2002年。


おかげで、それは興味深い読み物です。どのようにしてO(LN log(N))時間を取得しましたか?いいな。しかし、アルゴリズムの説明は「類似度行列の構築」で始まり、私が理解している限り、これはNxN行列になります。
Daniel Darabos、2015年

複雑さは本の中で説明されて@DanielDarabos R.と実用的なグラフマイニング
Sycoraxは回復モニカ言う

1

クレイジーですが動作する可能性が高いアプローチは、周波数領域に行くことかもしれません。「スパースFFT」と呼ばれるクレイジー/シックな高速FFTがあり、気になるモードの数(100個の機能の数)を指定してから、畳み込みで作業し、しきい値より大きい行の最大値を探します(あなたの数の上位レジスタのビット)。になるだろうここで、。K < < NO(klogn)k<<n

kが100でnが1e6の場合、従来のFFTと比較して〜1e4倍高速になります。

さらに20倍の速度が必要で、リスクを冒す場合は、ドメインに対してすべての行を複雑にしてピークを探す代わりに、行のサブセットをブートストラップできます。

また、合計が50未満である列、または照合する行数の半分程度のその他のしきい値を削除して、列をプレフィルターすることもできます。少なくとも、情報がないように、すべて0と1の列を削除する必要があります。完全に空または十分に空の行、または関連性がないほどいっぱいになっている行についても同様です。

タスク:合成データを使用してここに例を示し、いくつかの方法を比較します。


0

私は直接関連する論文に出くわしました。

ランダム化アルゴリズムとNLP:局所性に敏感なハッシュ関数を使用した高速名詞クラスタリング(Ravichandran et al、2005)

それは実際に私が見つけた場所であるhttps://github.com/soundcloud/cosine-lsh-join-sparkに実装されています

局所性に敏感なハッシュに基づいています(すでに他の回答で言及されています)。特徴ベクトルを低次元空間に削減した後、高速ハミング距離結合を使用して最近傍を見つけます。

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