You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
412 B
25 lines
412 B
1 year ago
|
package mathx
|
||
|
|
||
|
import "math"
|
||
|
|
||
|
const epsilon = 1e-6
|
||
|
|
||
|
func CalcEntropy(m map[any]int) float64 {
|
||
|
if len(m) == 0 || len(m) == 1 {
|
||
|
return 1
|
||
|
}
|
||
|
var entropy float64
|
||
|
var total int
|
||
|
for _, v := range m {
|
||
|
total += v
|
||
|
}
|
||
|
for _, v := range m {
|
||
|
probe := float64(v) / float64(total)
|
||
|
if probe < epsilon {
|
||
|
probe = epsilon
|
||
|
}
|
||
|
entropy -= probe * math.Log2(probe)
|
||
|
}
|
||
|
return entropy / math.Log2(float64(len(m)))
|
||
|
}
|