Здесь находится Curse of Dimensionality. Вы можете рассмотреть возможность применения Основного анализа компонентов (PCA), чтобы уменьшить размерность, но, насколько я знаю, для этого нет большого ответа.
Я уже сталкивался с этим типом проблемы (в аудио и видео фингерпринце), иногда до 30 измерений. Анализ обычно показал, что некоторые из измерений не содержат релевантной информации для поиска (фактически нечеткие поиски, моя главная цель), поэтому я опустил их из структур индексов, используемых для доступа к данным, но включил их в логику для определения совпадений с список кандидатов, найденных во время обыска. Это эффективно уменьшало размерность до приемлемого уровня.
Я упростил дальнейшее измерение путем квантования оставшихся измерений строго, так что все многомерное пространство было отображено в 32-битное целое число. Я использовал это как ключ на карте STL (красно-черное дерево), хотя я мог бы использовать хеш-таблицу. Я смог добавить миллионы записей динамически к такой структуре (на основе RAM, конечно) примерно через минуту или две, и поиски в среднем занимали миллисекунду в среднем, хотя данные были отнюдь не равномерно распределены. Поиски требовали тщательного перечисления значений в размерах, которые были сопоставлены с 32-битным ключом, но были достаточно надежными для использования в коммерческом продукте. Я считаю, что он используется по сей день в iTunes Match, если мои источники верны. :)
Суть в том, что я рекомендую вам взглянуть на ваши данные и сделать что-то обычай, который использует в нем функции, чтобы быстро индексировать и искать. Найдите размеры, которые больше всего отличаются друг от друга и являются самыми независимыми друг от друга. Квантируйте их и используйте их как ключ в индексе. Каждое ведро в индексе содержит все элементы, которые разделяют этот ключ (вероятно, будет больше одного). Чтобы найти ближайших соседей, посмотрите на «близкие» ключи и в каждом ковше найдите близлежащие значения. Удачи.
p.s. Я написал статью о своей технике, доступной here. Извините за paywall. Возможно, вы можете найти бесплатную копию в другом месте. Дайте мне знать, если у вас есть какие-либо вопросы по этому поводу.
Спасибо, но я бы не хотел уменьшать размерность данных, так как я хочу точный kNN в исходном пространстве. –
Достаточно справедливо, хотя я никогда не видел значения в поиске фиксированного количества соседей на различном расстоянии. Поиск переменного числа соседей на фиксированном расстоянии всегда казался мне более практичным. –
@ Randall, хорошо. «32-разрядный ключ в карте STL» означает точное совпадение, или 32 1-битных соседей? Любые идеи по [бит-строке-ближайший-сосед-поиск] (http://stackoverflow.com/questions/9959728/bit-string-nearest-neighbour-searching) - выглядят NP-полными? – denis