Хорошо ли подходит реляционная база данных для векторных расчетов? - PullRequest
2 голосов
/ 26 августа 2009

Базовая схема таблицы выглядит примерно так (я использую MySQL BTW):

integer unsigned <b>vector-id</b> <br>integer unsigned <b>fk-attribute-id</b> <br>float <b>attribute-value</b> <br>primary key (<b>vector-id</b>,<b>fk-attribute-id</b>)

Вектор представлен в виде нескольких записей в таблице с одинаковым vector-id

Мне нужно построить отдельную таблицу с точечным произведением (также евклидовым расстоянием) всех векторов, которые существуют в этой таблице. Итак, мне нужна таблица результатов, которая выглядит следующим образом:

integer unsigned <b>fk-vector-id-a</b> <br>integer unsigned <b>fk-vector-id-b</b> <br>float <b>dot-product</b>

... и тому подобное ...

integer unsigned <b>fk-vector-id-a</b> <br>integer unsigned <b>fk-vector-id-b</b> <br>float <b>euclidean-distance</b>

Какова лучшая структура запроса для получения моего результата?

С очень большими векторами, является ли реляционная база данных лучшим подходом для решения этой проблемы, или я должен усвоить векторы в приложении и выполнить там вычисления?

1 Ответ

4 голосов
/ 26 августа 2009
INSERT
INTO    dot_products
SELECT  v1.vector_id, v2.vector_id, SUM(v1.attribute_value * v2.attribute_value)
FROM    attributes v1
JOIN    attributes v2
ON      v2.attribute_id = v1.attribute_id
GROUP BY
        v1.vector_id, v2.vector_id

В MySQL это может быть быстрее:

INSERT
INTO    dot_products
SELECT  v1.vector_id, v2.vector_id,
        (
        SELECT  SUM(va1.attribute_value * va2.attribute_value)
        FROM    attributes va1
        JOIN    attributes va2
        ON      va2.attribute_id = va1.attribute_id
        WHERE   va1.vector_id = v1.vector_id
                AND va2.vector_id = v2.vector_id
        )
FROM    vector v1
CROSS JOIN
        vector v2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...