【问题标题】:Algorithm for tracking values through time通过时间跟踪值的算法
【发布时间】:2020-05-11 14:27:24
【问题描述】:

可能有一个已知的算法可以做到这一点,但我无法使用我的 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)

我想根据与以前值的相似性来跟踪这些值集。 IE。在上面的例子中,我有两个主要趋势(Mag 10Mag 17),有几种具体情况:

  1. 我很快就会丢失其中一个值的时刻(Mag 10 丢失在 t = 3 中),
  2. 我很快就会得到一个新的临时/无效读数(Mag 6 in t = 5),
  3. 不完全清楚哪个集合对应于前一个样本的时刻(Mag 9.2Mag 11.2 都可能是前一个样本的 Mag 10.2 的延续,在 t = 8 中很明显现在有两个不同的集合(Mag 9.8Mag 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 个项目后,时间复杂度会变得有问题。这也感觉像是在重新发明轮子。

是否有已知/更好的(就时间复杂度而言)算法来执行此操作?

【问题讨论】:

标签: algorithm permutation matching trend


【解决方案1】:

如果不限制源的行为,显然没有解决方案。如果我们可以说来自不同来源的量级被合理地分开,并且变化合理地小,那么解决方案就是保持趋势在排序顺序中。然后对它们进行二进制搜索以找到最接近新读数的趋势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多