我正在尝试编写一种算法,用于查找最接近一组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翻译和旋转数学解决方案使我无法解决。
Link to the graph & data I am processing< - 您只需点击十字架即可关闭注册窗口
答案 0 :(得分: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