找到一组 3D 路径中与所有其他路径最相似的路径
Find the path that most closely resembles all other paths of a group of 3D paths
我正在尝试编写一种算法来查找与一组 3D 路径中的所有其他路径最相似的 3D 路径。如果您查看提供的(底部)中的图表 link,它应该输出 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 <- 您只需点击叉号即可关闭注册 window
我通过总结轴 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)
}
注意:"classification"是问题中描绘的数据框。
结果输出:
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
我正在尝试编写一种算法来查找与一组 3D 路径中的所有其他路径最相似的 3D 路径。如果您查看提供的(底部)中的图表 link,它应该输出 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 <- 您只需点击叉号即可关闭注册 window
我通过总结轴 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)
}
注意:"classification"是问题中描绘的数据框。
结果输出:
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