Вычисление Энтропии
Я пытался в течение нескольких часов вычислить энтропию, и я знаю, что чего-то не хватает. Надеюсь, кто-то здесь может дать мне идею!
EDIT: я думаю, что моя формула неверна!
код:
info <- function(CLASS.FREQ){
freq.class <- CLASS.FREQ
info <- 0
for(i in 1:length(freq.class)){
if(freq.class[[i]] != 0){ # zero check in class
entropy <- -sum(freq.class[[i]] * log2(freq.class[[i]])) #I calculate the entropy for each class i here
}else{
entropy <- 0
}
info <- info + entropy # sum up entropy from all classes
}
return(info)
}
Я надеюсь, что мой пост ясен, так как это первый раз, когда я действительно публикую здесь.
это мой набор данных:
buys <- c("no", "no", "yes", "yes", "yes", "no", "yes", "no", "yes", "yes", "yes", "yes", "yes", "no")
credit <- c("fair", "excellent", "fair", "fair", "fair", "excellent", "excellent", "fair", "fair", "fair", "excellent", "excellent", "fair", "excellent")
student <- c("no", "no", "no","no", "yes", "yes", "yes", "no", "yes", "yes", "yes", "no", "yes", "no")
income <- c("high", "high", "high", "medium", "low", "low", "low", "medium", "low", "medium", "medium", "medium", "high", "medium")
age <- c(25, 27, 35, 41, 48, 42, 36, 29, 26, 45, 23, 33, 37, 44) # we change the age from categorical to numeric
2 ответов
в конечном счете я не нахожу ошибки в вашем коде, поскольку он работает без ошибок. Я думаю, что вам не хватает является расчет частоты класса и вы получите свой ответ. Быстро работает через различные объекты, которые вы предоставляете, я подозреваю, что вы смотрите на buys
.
buys <- c("no", "no", "yes", "yes", "yes", "no", "yes", "no", "yes", "yes", "yes", "yes", "yes", "no")
freqs <- table(buys)/length(buys)
info(freqs)
[1] 0.940286
что касается улучшения вашего кода, Вы можете значительно упростить это, поскольку вам не нужен цикл, Если вам предоставлен вектор частот класса.
для пример:
# calculate shannon-entropy
-sum(freqs * log2(freqs))
[1] 0.940286
заметим, что функция entropy.empirical
находится в entropy
пакет, в котором вы устанавливаете единицы в log2, позволяя немного больше гибкости. Пример:
entropy.empirical(freqs, unit="log2")
[1] 0.940286
существует другой способ, аналогичный приведенному выше ответу, но с использованием другой функции.
> buys <- c("no", "no", "yes", "yes", "yes", "no", "yes", "no", "yes", "yes", "yes", "yes", "yes", "no")
> probabilities <- prop.table(table(buys))
> probabilities
buys
no yes
0.3571429 0.6428571
> -sum(probabilities*log2(probabilities))
[1] 0.940286
также есть встроенная функция entropy.empirical(probabilities, unit = "log2")