Как выполнить многомерный поиск по «N-ближайшим соседям»? - PullRequest
1 голос
/ 09 августа 2011

Я занимаюсь разработкой программного обеспечения для автоматической торговли на валютном рынке. В базе данных MYSQL у меня есть летние рыночные данные с пятиминутными интервалами. У меня есть 5 различных метрик для этих данных наряду с ценой и временем.

[Time|Price|M1|M2|M3|M4|M5] 
x ~400,0000

Time является первичным ключом, а M1 - M5 - это разные метрики (например, стандартное отклонение или наклон скользящей средней).

С учетом ввода M1, M2, M3, M4 и M5, как я могу эффективно определить местонахождение ближайших 5000 соседей? Обратите внимание, что каждая метрика является плавающей точкой и имеет различные распределения / диапазоны.

1 Ответ

1 голос
/ 09 августа 2011

Не знаю, как бы вы определили ближайшего соседа. Кажется, вы могли бы сделать разницу абсолютных значений между каждой метрикой и суммировать их. (Без абсолютного значения у вас могло бы быть две метрики, которые были бы далеко, но отменяли друг друга.)

Итак, ближайший сосед будет определен как имеющий самое низкое значение из этого квеста:

ABS(M1 - @M1) + ABS(M2 - @M2) + ABS(M3 - @M3) + ABS(M4 - @M4) + ABS(M5 - @M5)

Если это работает, тогда запрос будет:

SELECT TOP 5000 *
FROM YourTable
ORDER BY ABS(M1 - @M1) + ABS(M2 - @M2) + ABS(M3 - @M3) + ABS(M4 - @M4) + ABS(M5 - @M5)

Если вы хотите, вы также можете по-разному взвешивать каждую метрику:

SELECT TOP 5000 *
FROM YourTable
ORDER BY 2 * ABS(M1 - @M1) + 5 * ABS(M2 - @M2) + ABS(M3 - @M3) + 3 * ABS(M4 - @M4) + ABS(M5 - @M5)
...