2016-05-21 4 views
0

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

[1, 80, 120, 155, 281, 301] 

И один из массива для сравнения является

[-6, 78, 108, 121, 157, 182, 218, 256, 310, 408, 410] 

Как я могу совпасть значения в первом массиве их Закрывают значения во втором массиве, который будет дать ему самую низкую общую разницу. В случае, если это неясно

1 => -6, 80 => 78, 120 => 121, 155 => 157

чем 281 должен соответствовать до 310, так как он находится ближе, чем 256, однако это вынудит 301, чтобы соответствовать 256. Таким образом, лучший матч в целом будет

281=>256 and 301=> 310

Тогда программа будет просто вычислить рейтинг, выполнив

abs(-6 - 1) + abs(78-80) и т.д. для всех матчей. И массив с самым низким рейтингом является лучшим матчем

******* Примечание *******

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

+0

Вы можете вычислить расстояние между массивами, чтобы определить сходство. Есть ли шум в данных? Являются ли данные линейными? –

+0

Нет значений, которые следует игнорировать (шум), и массивы будут отсортированы как линейные. Как вы вычисляете расстояние? –

ответ

0

В целом вычисленное расстояние более точно. Есть different approaches с преимуществами и недостатками. В вашем примере вы вычисляете сумму one dimension euclidean distances. Но есть более расширенные сравнения, такие как dynamic time warping. Это алгоритм, который находит лучшее выравнивание между двумя «массивами» и вычисляет оптимальное расстояние.

Вы можете установить и использовать пакет this. Here вы можете увидеть наглядный пример. Другим преимуществом DTW является то, что длина массивов не должна совпадать.

+0

Я пытаюсь написать этот код в ruby, там есть рубиновый камень, который дает вычисления DTW. –

+0

Извините, я не узнал язык программирования. (В деталях вы используете слово 'array' вместо' list'.) В любом случае я нашел этот rubygem: https://rubygems.org/gems/dtw –