26个英文字母在平均出现时的信息熵是4.7BIT,而去掉冗余度后的英文字母的信息熵是4.03BIT。
公式: H(信息熵) = -∑ Pi log2(Pi); Pi:为每个字母在信息中出现的概率; 计算公式并不复杂. 取以2为底的对数的道理也很简单,因为如果: 2n = X 的话,那么logX = n; 所以可以看出所谓信息熵就二进制的字符集在去掉冗余度后的二进制编码位数.冗余度是通过统计每个字符出现概率获得的。
各个字母英语中出现的频率
字母
|
英语中出现的频率
|
---|---|
a
|
8.167%
|
b
|
1.492%
|
c
|
2.782%
|
d
|
4.253%
|
e
|
12.702%
|
f
|
2.228%
|
g
|
2.015%
|
h
|
6.094%
|
i
|
6.966%
|
j
|
0.153%
|
k
|
0.772%
|
l
|
4.025%
|
m
|
2.406%
|
n
|
6.749%
|
o
|
7.507%
|
p
|
1.929%
|
q
|
0.095%
|
r
|
5.987%
|
s
|
6.327%
|
t
|
9.056%
|
u
|
2.758%
|
v
|
0.978%
|
w
|
2.360%
|
x
|
0.150%
|
y
|
1.974%
|
z
|
0.074%
|
python代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import math def calEntropy(string): h = 0.0 sumt = 0 letter = [0] * 26 string = string.lower() for i in range(len(string)): if string[i].isalpha(): letter[ord(string[i]) - ord('a')] += 1 sumt += 1 print('\n', letter) for i in range(26): p = 1.0 * letter[i] / sumt if p > 0: h += -(p * math.log(p, 2)) return h test = input("输入一个英文句子:") print('\n熵为:', calEntropy(test)) ''' letter = [8167,1492,2782,4253,12702,2228,2015,6094,6966,153,772,4025,2406,6749,7507,1929,95,5987,6327,9056,2758,978,2360,150,1974,74] h = 0 for i in range(26): h += -(letter[i]/sum(letter)*math.log(letter[i]/sum(letter),2)) print(h) ''' |
结果