2016-08-25 3 views
0

を削除するジェフ・アトウッドによって回答に基づいてエントロピー計算です:http://en.wikipedia.org/wiki/Entropy_(information_theory)に基づいていHow to calculate the entropy of a file?はここで変更可能な和VAR

object MeasureEntropy extends App { 

    val s = "measure measure here measure measure measure" 

    def entropyValue(s: String) = { 

    val m = s.split(" ").toList.groupBy((word: String) => word).mapValues(_.length.toDouble) 
    var result: Double = 0.0; 
    val len = s.split(" ").length; 

    m map { 
     case (key, value: Double) => 
     { 
      var frequency: Double = value/len; 
      result -= frequency * (scala.math.log(frequency)/scala.math.log(2)); 
     } 
    } 

    result; 
    } 

    println(entropyValue(s)) 
} 

私はに関連する可変状態を除去することによって、これを改善したいと思います:

var result: Double = 0.0; 

resultmap関数で計算するにはどうすればよいですか?

+3

ヒント:foldLeft –

答えて

1

それは以下のようなfoldLeftを使用して記述することができ

m.map { 
    case (key, value: Double) => 
    val frequency: Double = value/len; 
     - frequency * (scala.math.log(frequency)/scala.math.log(2)); 
}.sum 
1

:シンプルsumは、トリックを行います。

def entropyValue(s: String) = { 
    val m = s.split(" ").toList.groupBy((word: String) => word).mapValues(_.length.toDouble) 
    val len = s.split(" ").length 
    m.foldLeft(0.0)((r, t) => r - ((t._2/len) * (scala.math.log(t._2/len)/scala.math.log(2)))) 
    } 
関連する問題