Разреженный точечный продукт в SQL - PullRequest
8 голосов
/ 30 июня 2009

Представьте, что у меня есть таблица, в которой хранится серия разреженных векторов. Разреженный вектор означает, что он явно хранит только ненулевые значения в структуре данных. Я мог бы иметь вектор размером 1 миллион, но я храню только значения для измерений, отличных от нуля. Таким образом, размер пропорционален количеству ненулевых элементов, а не размерности вектора.

Определение таблицы будет выглядеть примерно так: vector_id: int размерность: int значение: float

Теперь в обычном программировании я могу вычислить внутреннее произведение или произведение точек двух векторов за O (| v1 | + | v2 |) время. По сути, алгоритм состоит в том, чтобы хранить разреженные векторы, отсортированные по измерениям, и выполнять итерацию по измерениям в каждом из них, пока не найдете коллизии между измерениями, не умножите значения общего измерения и не добавляйте их до тех пор, пока не достигнете конца одного из векторов .

Какой самый быстрый способ реализовать это в SQL?

1 Ответ

5 голосов
/ 30 июня 2009

Вы должны быть в состоянии повторить этот алгоритм в одном запросе:

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 = ...
...