2014-12-02 17 views
9

Próbowałem przez kilka godzin, aby obliczyć Entropy i wiem, że czegoś brakuje. Mam nadzieję, że ktoś tutaj da mi pomysł!Obliczanie entropii

EDYCJA: Myślę, że moja formuła jest zła!

KOD:

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) 
    } 

Mam nadzieję, że mój post jest jasne, ponieważ jest to pierwszy raz, kiedy rzeczywiście pisać tutaj.

To mój zestaw danych:

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

Jak na ironię, im gorsze obliczenia, tym bliższa jest odpowiedź. – Strawberry

+0

Dobrze byłoby opublikować (a) formułę, która Twoim zdaniem jest właściwa, oraz (b) próbkę typu danych, które będą podawane do tej funkcji. Używanie 'dput()' to świetny sposób na udostępnianie danych. – Gregor

+0

Jakiej odpowiedzi oczekujesz? Twój kod działa bezbłędnie i poprawnie oblicza entropię shannon. – cdeterman

Odpowiedz

14

Ostatecznie mogę znaleźć żadnego błędu w kodzie, jak to działa bezbłędnie. Część, o której myślę, że tęsknisz, to obliczanie częstotliwości klasowych, a dostaniesz odpowiedź. Szybko przechodzę przez różne obiekty, które podasz Podejrzewam, że patrzysz na 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 

W gruncie poprawę kodu, można uprościć ten dramatycznie, jak nie trzeba pętlę jeśli dostarczono wektor częstotliwości klasowych.

Na przykład:

# calculate shannon-entropy 
-sum(freqs * log2(freqs)) 
[1] 0.940286 

Na marginesie, funkcja entropy.empirical jest w opakowaniu entropy gdzie można ustawić jednostki do log2 pozwalającego na nieco większą elastyczność. Przykład:

entropy.empirical(freqs, unit="log2") 
[1] 0.940286 
+0

Dziękuję, twoja odpowiedź pomogła mi to zrozumieć. – Codex

+0

@Codex, cieszymy się z pomocy. Jeśli chodzi o twój ostatni komentarz, po prostu skopiowałem twoje obiekty i wykonałem powyższe obliczenia, aby znaleźć właściwy. Proszę przyjąć odpowiedź, jeśli to ci odpowiada. – cdeterman