Алгоритм отслеживания значений во времени

Вероятно, для этого существует известный алгоритм, но я не смог найти его, используя свои навыки 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) с несколькими специфическими ситуациями:

  1. моменты, когда я вскоре потеряю одно из значений (Mag 10 теряется в t = 3),
  2. моменты, когда я вскоре получаю новое временное/недействительное показание (Mag 6 в t = 5) для одного образца,
  3. моменты, когда не совсем понятно, какой набор соответствует предыдущему образцу (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 элементов. Это также похоже на изобретение велосипеда.

Есть ли известный/лучший (с точки зрения временной сложности) алгоритм для этого?


person Lou    schedule 11.05.2020    source источник
comment
Может быть, это модель скользящего окна?   -  person Neil    schedule 11.05.2020


Ответы (1)


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

person user58697    schedule 11.05.2020