まずググってトップにでてくるやつ
2019年の資料。読み切れてないが概観するにはとても良かった。 特に気になったのは以下の点
- PythonおすすめANN手法選択フローチャート
- 10^9までなら nmslib (hnsw)が良いらしい
- それ以上なら faiss-cpu になる。参考:近傍探索ライブラリFaissを使ってみた
- ANNの問題
- 数学的背景が無く、実データで実測で速ければ良いとなってる
- 評価手段が無い(データ依存で偶然良いのか、実装が良いのかわからない)
現在までの3年にアップデートがあるかは気になる。
- Elasticsearch 8 が 近似近傍探索 をサポートした
kNNなので、あらかじめクラス分けできていることが前提で、ちょっと欲しいものと違う(そのままで使えるかわかんない)かもkNNとは近傍k個の取得なので大丈夫そう- Elasticsearch 8.0.0は 2022-02-11 リリース。比較的最近の機能。結構頻繁にリリースされており、現在の最新は 8.5.2
- ベースになってる Lucene が対応したことによるらしい
https://www.rondhuit.com/soleami-comparison-classifier.html (2014/2/25初出の記事) より
- Mahout は懐かしの Hadoop で動く機械学習アルゴリズム。バッチ処理には使えそう
Lucene は 4.2 から文書分類ツールが提供されるようになりました
Lucene には、単純ベイズと k-NN 法による分類器が実装されています
Mahout は同じく単純ベイズと、さらにランダムフォレストで文書分類を行ってみましょう
lucene-classification パッケージ
Lucene 自身は k-NN までで、ANNまではサポートしてなさそう。
2019年にLuceneでANNする論文が出てる
Lucene for Approximate Nearest-Neighbors Search on Arbitrary Dense Vectors
9.0にAN Vector検索を実装したらしいissueがあった apache/lucene#10047
Release Node 9.0 よりそれっぽい記述
Support for indexing high-dimensionality numeric vectors to perform nearest-neighbor search, using the Hierarchical Navigable Small World graph algorithm
HSNWを使ってる: 参考Javadoc
ElasticsearchのANN Searchを試す:
LuceneとANNの経緯から説明してる記事。
- JavaというくくりならLuceneのHSNWでANNすれば良いのでは?
- もっと広く構えるならPython使ってANNに慣れたほうが良い
- いずれにせよデータがいる
- データの下処理も問題になりそう
- データ次第でパラメーターも変わる恐れがある