Метод в этом направлении может работать:
Для обеих последовательностей:
Установите кривую в последовательности. Убедитесь, что у вас есть непрерывная взаимно-однозначная функция от [0,1] до точек на этой кривой. То есть для каждого (действительного) числа от 0 до 1 эта функция возвращает принадлежащую ей точку на кривой. Отслеживая функцию для всех чисел от 0 до 1, вы получаете всю кривую.
Один из способов подгонки кривой - провести прямую линию между каждой парой последовательных точек (это не очень хорошая кривая, потому что у нее острые изгибы, но она может подойти для вашей цели). В этом случае функция может быть получена путем расчета общей длины всех отрезков (Пифагор). Точка на кривой, соответствующая числу Y (между 0 и 1), соответствует точке на кривой, которая имеет расстояние Y * (общая длина всех отрезков линии) от первой точки последовательности, измеренной путем перемещения по отрезки (!!).
Теперь, после того как мы получили такую функцию F (double) для первой последовательности и G (double) для второй последовательности, мы можем вычислить подобие следующим образом:
double epsilon = 0.01;
double curveDistanceSquared = 0.0;
for(double d=0.0;d<1.0;d=d+epsilon)
{
Point pointOnCurve1 = F(d);
Point pointOnCurve2 = G(d);
//alternatively, use G(1.0-d) to check whether the second sequence is reversed
double distanceOfPoints = pointOnCurve1.EuclideanDistance(pointOnCurve2);
curveDistanceSquared = curveDistanceSquared + distanceOfPoints * distanceOfPoints;
}
similarity = 1.0/ curveDistanceSquared;
Возможные улучшения:
-Найдите улучшенный способ подгонки под кривые. Обратите внимание, что вам все еще нужна функция, которая отслеживает кривую для работы вышеуказанного метода.
-При расчете расстояния рассмотрите возможность перепараметризации функции G таким образом, чтобы расстояние было минимальным. (Это означает, что у вас есть возрастающая функция R, такая, что R (0) = 0 и R (1) = 1,
но который в целом является общим. При расчете расстояния вы используете
Point pointOnCurve1 = F(d);
Point pointOnCurve2 = G(R(d));
Впоследствии вы пытаетесь выбрать R таким образом, чтобы расстояние было минимальным. (чтобы увидеть, что происходит, обратите внимание, что G (R (d)) также отслеживает кривую)).