【发布时间】: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 10 和Mag 17),有几种具体情况:
- 我很快就会丢失其中一个值的时刻(
Mag 10丢失在t = 3中), - 我很快就会得到一个新的临时/无效读数(
Mag 6int = 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 个项目后,时间复杂度会变得有问题。这也感觉像是在重新发明轮子。
是否有已知/更好的(就时间复杂度而言)算法来执行此操作?
【问题讨论】:
-
可能是sliding window 模型?
标签: algorithm permutation matching trend