2014-12-02 3 views
9

Я пробовал несколько часов, чтобы вычислить Энтропию, и я знаю, что что-то упускаю. Надеюсь, кто-то здесь может дать мне идею!Расчет Энтропии

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 
+1

По иронии судьбы, чем хуже вычисление, тем ближе ответ. – Strawberry

+0

Было бы неплохо опубликовать (а) формулу, которую вы считаете правильным, и (б) образец типа данных, который вы будете подавать на эту функцию. Использование 'dput()' - отличный способ обмена данными. – Gregor

+0

Какой ответ вы ожидаете? Ваш код работает без ошибок и правильно вычисляет shannon-entropy. – cdeterman

ответ

14

В конце концов я не нахожу никакой ошибки в коде, как она работает без ошибок. Часть, которую, я думаю, вам не хватает, это вычисление частот класса, и вы получите ответ. Быстро просматривая различные объекты, которые вы предоставляете, я подозреваю, что вы смотрите на 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 
+0

Спасибо, ваш ответ помог мне понять это. – Codex

+0

@Codex, рад помочь. Что касается вашего последнего комментария, я просто скопировал ваши объекты и выполнил приведенный выше расчет на каждом, чтобы найти правильный. Пожалуйста, примите ответ, если это вас удовлетворяет. – cdeterman

Смежные вопросы