Выход энтропии равен NaN для некоторых решений класса, а не для других - PullRequest
0 голосов
/ 19 апреля 2020

Я выполняю анализ скрытого класса в R и использую функцию Entropy. Я хотел понять, почему в выходных данных он выдает результат для более низких n-классов, а затем NaN для более высоких N-классов.

Я новичок в программном обеспечении!

Для справки здесь вывод и код:

> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_2class$P) # Class proportions
> error_post <- mean(apply(France_2class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8121263
> 
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_3class$P) # Class proportions
> error_post <- mean(apply(France_3class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8139903
> 
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_4class$P) # Class proportions
> error_post <- mean(apply(France_4class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
> 
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_5class$P) # Class proportions
> error_post <- mean(apply(France_5class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
> 
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_6class$P) # Class proportions
> error_post <- mean(apply(France_6class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN

Может кто-нибудь помочь? Спасибо

1 Ответ

1 голос
/ 19 апреля 2020

Полагаю, проблема в определении entropy. Точнее, если 0 содержится в p, то вы получите NaN, например,

> entropy(p1)
[1] 1.279854

> entropy(p2)
[1] NaN

> entropy(p3)
[1] 0.5004024

Чтобы исправить это, вы можете добавить na.omit к функции entropy как показано ниже

entropy<-function(p) sum(na.omit(-p*log(p)))

, тогда вы можете увидеть

> entropy(p1)
[1] 1.279854

> entropy(p2)
[1] 0.5004024

> entropy(p3)
[1] 0.5004024

ДАННЫЕ

p1 <- c(0.1,0.2,0.3,0.4)
p2 <- c(0,0.2,0.8)
p3 <- c(0.2,0.8)
...