8

一連のスパース ベクトルを格納するテーブルがあるとします。スパース ベクトルとは、ゼロ以外の値のみを明示的にデータ構造に格納することを意味します。100 万次元のベクトルを持つこともできますが、ゼロ以外の次元の値のみを保存します。したがって、サイズはベクトルの次元ではなく、ゼロ以外のエントリの数に比例します。

テーブル定義は次のようになります: vector_id : int ディメンション : int 値 : float

現在、通常のプログラミングの世界では、2 つのベクトルの内積または内積を O(|v1| + |v2|) 時間で計算できます。基本的に、アルゴリズムは、次元ごとに並べ替えられたスパース ベクトルを格納し、次元間の衝突が見つかるまでそれぞれの次元を反復処理し、共有次元の値を乗算し、いずれかのベクトルの最後に到達するまでそれらを加算し続けることです。 .

SQLでこれを実現する最速の方法は何ですか?

4

1 に答える 1

5

このアルゴリズムを 1 つのクエリで複製できるはずです。

select sum(v1.value * v2.value)
from vectors v1
inner join vectors v2
on v1.dimension = v2.dimension
where v1.vector_id = ...
and v2.vector_id = ...
于 2009-06-29T20:52:35.660 に答える