Неправильная реализация NMI в R? - PullRequest
0 голосов
/ 21 мая 2019
#calculate NMI(c,t) c : cluster assignment , t : ground truth

NMI <- function(c,t){
n <- length(c) # = length(t)
r <- length(unique(c))
g <- length(unique(t))

N <- matrix(0,nrow = r , ncol = g)
for(i in 1:r){
    for (j in 1:g){
        N[i,j] = sum(t[c == i] == j)
    }
}

N_t <- colSums(N)
N_c <- rowSums(N)

B <- (1/n)*log(t( t( (n*N) / N_c ) / N_t))
W <- B*N
I <- sum(W,na.rm = T) 



H_c <- sum((1/n)*(N_c * log(N_c/n)) , na.rm = T)
H_t <- sum((1/n)*(N_t * log(N_t/n)) , na.rm = T)    

nmi <- I/sqrt(H_c * H_t)

return (nmi)
}

Выполнение этого в некоторых тестах кластеризации здесь дает мне значение нормализованной взаимной информации. Но когда я сравниваю его со значениями NMI, полученными из библиотеки aricode, я получаю значения NMI, которые обычно отличаются во втором десятичном знаке.

Буду признателен, если кто-то сможет точно указать любую возможную ошибку, которая закралась в этот код.

Я включаю тестовый пример для этого, используя синтетический случай:

library(aricode)
c <- c(1,1,2,2,2,3,3,3,3,4,4,4)
t <- c(1,2,2,2,3,4,3,3,3,4,4,2)
print(aricode::NMI(c , t))   #0.489574
print(NMI(c,t))              #0.5030771
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...