Найдите путь, который больше всего напоминает все другие пути группы трехмерных путей

Я пытаюсь написать алгоритм для нахождения трехмерного пути, наиболее близко напоминающего все другие пути в группе трехмерных путей. Если вы посмотрите на график в (внизу) предоставленной ссылке, он должен вывести 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

Из этого кадра данных мне нужен путь, который имеет самые низкие значения для большинства путей.

Вероятно, это довольно простое решение, но после всех трёхмерных переводов и ротационной математики решение ускользает от меня.

Ссылка на график и данные, которые я обрабатываю <- Вы можете просто нажать на крестик, чтобы закрыть окно регистрации

1 ответ

Я устранил проблему, суммируя отдельные затраты на анализ осей 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
Другие вопросы по тегам