web-dev-qa-db-ja.com

エントロピーの計算

私はエントロピーを計算するために数時間試しましたが、何かが足りないことを知っています。うまくいけば、ここの誰かが私にアイデアを与えることができます!

編集:私の公式は間違っていると思います!

コード:

 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
13
Codex

エラーなしで実行されるので、最終的にはコードにエラーは見つかりません。私があなたが欠けていると思う部分はクラスの頻度の計算であり、あなたはあなたの答えを得るでしょう。提供するさまざまなオブジェクトをすばやく実行すると、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.empiricalentropyパッケージにあり、単位をlog2に設定すると、柔軟性が向上します。例:

entropy.empirical(freqs, unit="log2")
[1] 0.940286
21
cdeterman

上記の回答に似た別の方法がありますが、別の関数を使用します。

_> 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")もあります。

1
Arun