現在、Locality-sensitive ハッシュを使用して最近傍を見つける方法を研究しています。ただし、論文を読んだり Web を検索したりしているときに、これを行うための 2 つのアルゴリズムを見つけました。
1- L 個のランダム LSH 関数で L 個のハッシュ テーブルを使用すると、類似した 2 つのドキュメントが同じ署名を取得する可能性が高くなります。たとえば、2 つのドキュメントが 80% 類似している場合、1 つの LSH 関数から同じ署名を取得する可能性は 80% です。ただし、複数の LSH 関数を使用すると、LSH 関数の 1 つからドキュメントに対して同じ署名を取得する可能性が高くなります。この方法はウィキペディアで説明されており、私の理解が正しいことを願っています:
http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search
2- もう 1 つのアルゴリズムは、Moses S. Charikar による Rounding Algorithms からの類似性推定手法と呼ばれる論文 (セクション 5) の方法を使用します。これは、1 つの LSH 関数を使用して署名を生成し、それに P 順列を適用してリストを並べ替えることに基づいています。実は私はその方法をよく理解していないので、誰かがそれを明確にしてくれることを願っています.
私の主な質問は、なぜ最初の方法ではなく 2 番目の方法を使用するのでしょうか? 私が見つけたように、それはより簡単で高速です。
誰かが助けてくれることを本当に願っています!!!
EDIT:実際には、@ Raff.Edwardが「最初」と「2番目」を混ぜていたかどうかはわかりません。2 番目の方法のみが半径を使用し、最初の方法はハッシュ ファミリ F で構成される新しいハッシュ ファミリ g を使用するためです。ウィキペディアのリンクを確認してください。多くの g 関数を使用してさまざまな署名を生成し、各 g 関数に対応するハッシュ テーブルを持っています。ポイントの最近傍を見つけるには、ポイントに g 関数を通過させ、対応するハッシュ テーブルの衝突をチェックするだけです。したがって、私はそれをより多くの機能として理解しました...衝突の可能性が増えました。
最初の方法の半径についての言及は見つかりませんでした。
2 番目の方法では、特徴ベクトルごとに 1 つの署名のみを生成し、それらに P 順列を適用します。これで、それぞれが n 個の署名を含む順列の P 個のリストができました。次に、P から各リストを並べ替えます。その後、クエリ ポイント q が与えられると、その署名を生成し、それに P 順列を適用してから、順列および並べ替えられた各 P リストで二分探索を使用して、最も類似した署名を見つけます。クエリq。私はそれについて多くの論文を読んだ後にこれを結論付けましたが、ハミング距離を見つけるのが速くないように見えるので、なぜ誰かがそのような方法を使用するのかまだわかりません!!!!
私にとっては、次のようにして、クエリ ポイント q の最近傍を見つけるだけです。署名のリスト N が与えられた場合、クエリ ポイント q の署名を生成し、リスト N をスキャンして、N の各要素と q の署名の間のハミング距離を計算します。したがって、q の最近傍が得られます。そして、それはO(N)かかります!!!