ベクトル量子化の実装を、さまざまなタイプとベクトルの次元 (たとえば、バイトの 16 次元ベクトル、または double の 4d ベクトルなど) を処理できる C++ テンプレート クラスとして設計しようとしています。
私はアルゴリズムを読んでいて、ほとんどを理解しています:
Linde-Buzo-Gray (LBG) アルゴリズムを実装したいのですが、クラスターを分割するための一般的なアルゴリズムを理解するのに苦労しています。平面の両側に等しい数があるように、クラスター内のベクトルを分割する平面 (超平面?) を定義する必要があると思います。
[編集して詳細情報を追加] これは反復プロセスですが、すべてのベクトルの重心を見つけることから始めて、その重心を使用して分割平面を定義し、平面の各側面の重心を取得し、続行すると思いますVQ アルゴリズムに必要な数のクラスターが得られるまで (途中で歪みが少なくなるように最適化を繰り返します)。上記の最初のリンクのアニメーションは、それをうまく示しています。
私の質問は次のとおりです。
重心を取得したら、平面を見つけるアルゴリズムは何ですか?
ベクトルをテストして、その平面の両側にあるかどうかを確認するにはどうすればよいですか?