0

我正在尝试编写一种算法来查找与一组 3D 路径中的所有其他路径最相似的 3D 路径。如果您查看(底部)提供的链接中的图表,它应该输出 trace1。(通过目测)

为了能够比较路径的相似性,我使用动态时间规整(DTW)计算了每个轴的路径成本,组中的所有其他路径都给了我以下数据框:

   from to         x         y         z
1     1  2 2.2460834 2.3350118 0.9898763
2     1  3 4.0703514 3.2873548 1.7424783
3     1  4 3.1386396 3.1925206 2.7434982
4     1  5 2.3475482 3.4232058 1.3965482
5     1  6 2.2899544 2.0498909 1.2892379
6     1  7 2.9042872 2.6445606 0.7676169
7     1  8 1.5259118 1.5580012 1.1033320
8     1  9 2.1399503 1.6253582 0.8797432
9     1 10 4.0400429 1.8293614 2.0989448
10    2  1 2.2460834 2.3350118 0.9898763
11    2  3 1.4793632 1.0747873 1.2075596
12    2  4 1.1333285 1.5574448 1.7058433
13    2  5 0.7593649 1.1794035 1.0677958
14    2  6 0.6467899 0.4950420 0.8100349
15    2  7 0.7879115 0.6047349 1.0033941
...
90   10  9 1.929852 0.4064518 1.669125

从这个数据框中,我需要大多数路径具有最低值的路径。

这可能是一个相当简单的解决方案,但在所有 3D 平移和旋转数学之后,我无法解决这个问题。

链接到我正在处理的图表和数据<- 您只需单击十字即可关闭注册窗口

4

1 回答 1

0

我通过汇总轴 DTW 分析的各个成本,将这些分数与来自同一路径来源的其他分数进行排名,然后总结每个路径组的排名,从而解决了这个问题。累积排名最低的测量值最接近其他所有路径。

结论:trace1 是最通用的路径,其中 5 和 6 位于共享的第二个位置。

代码:

#add accumulative score
classification <- classification %>% mutate(score = classification$x + classification$y + classification$z)    

#rank by accumulative score, add ranking to the dataframe
classification$ranking <- vector(length = nrow(classification))
for (i in unique(classification$from)) {
  classificationGroup <- classification[classification$from == i,]
  classificationGroup <- classificationGroup[order(classificationGroup$score),]

  for (ii in 1:nrow(classificationGroup)){
    classification[classification$to == classificationGroup[ii,]$to & classification$from == classificationGroup[ii,]$from,]$ranking <- ii
  }
}    

combinedrankingdf <- data.frame(measurement = vector(length = length(unique(classification$to))), accumulativeRank = vector(length = length(unique(classification$to))))
for (i in 1:nrow(combinedrankingdf)){
  combinedrankingdf$measurement[i] <- i
  combinedrankingdf$accumulativeRank[i] <- sum(classification[classification$to == i,]$ranking)
}    

注意:“分类”是问题中描述的数据框。

结果输出:

   measurement accumulativeRank
2            2               25
6            6               26
7            7               26
9            9               35
8            8               37
5            5               43
3            3               57
10          10               59
4            4               66
1            1               76
于 2018-01-24T11:27:52.710 回答