Вероятно, для этого существует известный алгоритм, но я не смог найти его, используя свои навыки Google, поэтому я попытаюсь описать, что мне нужно сделать и что я сделал до сих пор.
У меня есть источник характеристических значений системы, которые я хотел бы изобразить в виде тренда. Значения возвращаются из алгоритма в режиме реального времени, и каждое значение имеет набор свойств (величина, фаза, качество).
Однако эти значения могут появляться и исчезать со временем, и я также могу получить некоторые прерывистые значения, которые я проигнорирую, если они не повторяются в течение более длительного периода (несколько выборок).
Например, я мог бы получить эти значения:
Time (Mag, Phase, Quality)
t = 1 (10.10, 0.90, 0.90); (17.00, 0.02, 0,12)
t = 2 (10.15, 0.91, 0.89); (17.10, 0.12, 0,12)
t = 3 (17.10, 0.12, 0,12)
t = 4 (10.25, 0.91, 0.89); (17.12, 0.12, 0,12)
t = 5 ( 6.15, 0.41, 0.39); (10.35, 0.91, 0.89); (17.12, 0.12, 0,12)
t = 6 (10.20, 0.90, 0.85); (17.02, 0.13, 0,11)
t = 7 ( 9.20, 0.90, 0.85); (11.20, 0.90, 0.85); (17.02, 0.13, 0,11)
t = 8 ( 9.80, 0.90, 0.85); (11.80, 0.90, 0.85); (17.02, 0.13, 0,11)
Я хотел бы отслеживать эти наборы значений во времени в соответствии с их сходством с предыдущими значениями. т.е. в приведенном выше примере у меня есть два основных тренда (Mag 10
и Mag 17
) с несколькими специфическими ситуациями:
- моменты, когда я вскоре потеряю одно из значений (
Mag 10
теряется вt = 3
), - моменты, когда я вскоре получаю новое временное/недействительное показание (
Mag 6
вt = 5
) для одного образца, - моменты, когда не совсем понятно, какой набор соответствует предыдущему образцу (
Mag 9.2
иMag 11.2
оба могут быть продолжениемMag 10.2
из предыдущего образца, а вt = 8
становится очевидным, что теперь есть два разных набора (Mag 9.8
иMag 11.8
).
Если бы я просто сгруппировал значения по мере их поступления из системы, я бы не получил их правильные тренды, т.е. без отслеживания величины выглядели бы так:
Однако правильное сопоставление этих значений со старой величиной должно привести к такой тенденции:
Я написал алгоритм, который отслеживает значения во времени, эффективно сравнивая все перестановки наборов с предыдущими «активными» наборами. Он вычисляет разницу между всеми новыми значениями и предыдущими известными значениями, что в основном представляет собой алгоритм N^2
, а затем проверяет все перестановки, чтобы найти наименьшее общее расстояние (что-то вроде сложности N!
):
for each X in new_sets
for each Y in existing_sets
distance(X, Y) = calculate_distance(X, Y);
for each P in permutations(new_sets)
total_distance = sum(distance(X, Y)) for all (X, Y) in permutation
permutation P with min total_distance is the best match
По прошествии времени я также удаляю измерения из existing_sets
, если они не совпадают в нескольких выборках.
Это работает достаточно хорошо, пока у меня не слишком много значений, но временная сложность становится проблематичной после того, как я начну отслеживать более 10 элементов. Это также похоже на изобретение велосипеда.
Есть ли известный/лучший (с точки зрения временной сложности) алгоритм для этого?