Сходство строк строк

У меня есть несколько дорожек, записанных GPS, которые более формально могут быть описаны как ряд строк.

Теперь некоторые записанные дорожки могут быть записью одного и того же маршрута, но из-за неточностей в системе GPS факт, что записи были сделаны в отдельных случаях и что они, возможно, были записаны, путешествуя с разной скоростью, они не будут идеально совпадать, но все равно выглядят достаточно близко, если смотреть на карту человеком, чтобы определить, что это фактически тот же самый маршрут, который был записан.

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

Как бы вы вычислили сходство, учитывая, что аналогичные средства представляют один и тот же путь на карте?

Изменить: Для тех, кто не знает, о чем я говорю, посмотрите на эту ссылку для определения строки строки: http://msdn.microsoft.com/en-us/library/bb895372.aspx - я не спрашиваю о символьных строках.

Ответ 1

Вычислить расстояние Fréchet на каждой паре треков. Расстояние можно использовать для оценки сходства ваших дорожек.

Math alert: Фреше был пионером в области метрического пространства, который имеет отношение к вашей проблеме.

Ответ 2

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

Ответ 3

Чтобы определить "тот же маршрут", создайте минимальный набор нормализованных векторов пути, вычислите общие разности мощности и сравните общее с показателем качества.

  • Нормализовать путевые точки GPS на общей длине пути,
  • перемещайте векторы путей вместе, создавая новый набор векторов пути для каждого пути на основе кратчайшего вектора в каждой путевой точке,
  • вычислить общие разности мощности между конечными точками каждого вектора в нормированных путях, взвешивающими длину вектора, и
  • сравнить с мерой качества.

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

Пол Томблин сказал: я бы добавил буфер вокруг первой строки, основанной на оценочной вероятной ошибки, а затем определить, соответствует ли вторая линия полностью внутри буфера.

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

Ответ 4

Вы можете прогуливаться по каждой точке (Па) LineString A и измерять расстояние от Pa до ближайшего сегмента линии LineString B, усредняя каждое из этих расстояний.

Это не быстрый или совершенный метод, но он должен иметь возможность использовать полезный номер и довольно быстро реализовать.

Строки строк начинаются и заканчиваются в одинаковых точках, или они очень разных экстентов?

Ответ 5

Если вы считаете, что одна строка является последовательностью [x, y] точек (или [x, y, z] точек), вы можете вычислить сходство между каждой парой строк строки, используя Needleman-Wunsch. Как описано в указанной статье Википедии, алгоритм Needleman-Wunsch требует "матрицы подобия", которая определяет расстояние между парой точек. Однако было бы легко использовать функцию вместо матрицы. В вашем случае вы можете просто использовать функцию 2D Euclidean distance (или трехмерную евклидову функцию, если ваши точки имеют возвышение), чтобы обеспечить расстояние между ними пару точек.

Ответ 6

Я действительно сторонник человека (Aaron F), который сказал, что вас может заинтересовать проблема расстояния Levenshtein (и процитировано this), Его ответ кажется мне лучшим до сих пор.

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

В вашей проблеме кажется, что вы имеете дело с различиями между строками чисел, и вы заботитесь о числах. Если вы дадите больше информации, я, возможно, смогу направить вас к правильному варианту BLAST/FASTA/etc для ваших целей. В любом случае вы можете рассмотреть возможность адаптации BLAST и FASTA для ваших нужд. Они довольно просты.

1: http://en.wikipedia.org/wiki/Levenshtein_distance, http://www.nist.gov/dads/HTML/Levenshtein.html