Перестановка столбцов квадратной двусторонней таблицы сопряженности (матрицы) для максимизации ее диагонали - PullRequest
0 голосов
/ 27 сентября 2018

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

Я хочу автоматически переставить столбцы таблицы сопряженности, чтобы максимизировать ее диагональ.Например:

# Ground-truth labels
c1 = c(1,1,1,1,1,2,2,2,3,3,3,3,3,3,3)
# Labels found
c2 = c(3,3,3,3,1,1,1,1,2,2,2,3,2,2,1)
# Labels found but renamed correctly
c3 = c(1,1,1,1,2,2,2,2,3,3,3,1,3,3,2)

# Current output
tab1 <- table(c1,c2)
#   c2
#c1  1 2 3
#  1 1 0 4
#  2 3 0 0
#  3 1 5 1

# Desired output
tab2 <- table(c1,c3)
#   c3
#c1  1 2 3
#  1 4 1 0
#  2 0 3 0
#  3 1 1 5

На самом деле c3 недоступно.Есть ли простой способ получить c3, tab2 из c2, tab1?

1 Ответ

0 голосов
/ 27 сентября 2018
c1 <- c(1,1,1,1,1,2,2,2,3,3,3,3,3,3,3)
c2 <- c(3,3,3,3,1,1,1,1,2,2,2,3,2,2,1)

## table works with factor variables internally
c1 <- as.factor(c1)
c2 <- as.factor(c2)

tab1 <- table(c1, c2)
#       c2
#    c1  1 2 3
#      1 1 0 4
#      2 3 0 0
#      3 1 5 1

Ваш вопрос по существу: как изменить уровень c2, чтобы максимальное значение в строке находилось на главной диагонали.С точки зрения матричной операции, это перестановка столбцов.

## find column permutation index
## this can potentially be buggy if there are multiple maxima on a row
## because `sig` may then not be a permutation index vector
## A simple example is:
## tab1 <- matrix(5, 3, 3); max.col(tab1, "first")
sig <- max.col(tab1, "first")
#[1] 3 1 2

## re-level `c2` (create `c3`)
c3 <- factor(c2, levels = levels(c2)[sig])

## create new contingency table
table(c1, c3)
#   c3
#c1  3 1 2
#  1 4 1 0
#  2 0 3 0
#  3 1 1 5

## if creation of `c3` is not necessary, just do
tab1[, sig]
#   c3
#c1  3 1 2
#  1 4 1 0
#  2 0 3 0
#  3 1 1 5
...