私は興味深い問題を扱っています。
私は、 John Daugman のアルゴリズムを使用して人間の虹彩をバイナリ コードに変換する生体認証システムを持っています (大学での研究用)。
虹彩コードは「フラット」です (円として保存されるのではなく、長方形に変換されます)。
column 1 | column 2 | column 3 | ...
10011001 ...
10110111
01100010
...
column は 30 ビットを表します。問題は、虹彩のスキャンごとに独自のノイズ マスク (まぶた、反射など) があり、一致が 100% ではなく、せいぜい 96 ~ 98% 程度であることです。
これまでのところ、次のようなアルゴリズムを使用しています (ハミング距離マッチング):
mask = mask1 & mask2;
result = (code1 ^ code2) & mask;
// ration of 1 bits allowed by mask
double difference = (double)one_bits(result)/one_bits(mask);
現在、虹彩の実際のデータベースを構築しているという問題があります (約 1200 から 1300 の被験者、それぞれ 3 から 5 の虹彩サンプルで、ローテーションでカウントする必要があるため、それぞれについて約 10 のテストを行う必要があります)。そして、現在のサンプルをデータベース全体 (80*30 ビットで 65 000 回の比較) と比較する必要がありますが、これは遅いことがわかりました。
質問:データ構造を反映する (そして、ビットが少し変化すると少しだけ変化する) ハッシュ関数、または「エラー トレラント」なハッシュ関数はありますか? データベース全体で高速検索アルゴリズムを構築する必要があります (そのため、これをインデックス化する方法を探しています)。
更新:ある種の「最も近い隣人」ルックアップによって実装するか、ある種のクラスタリングを使用する必要があると思います (同様の虹彩がグループ化され、最初のラウンドでは一部の代表者のみがチェックされます)。