首先信息、香农熵、条件熵、信息增益都是信息论里面的概念。
本文章的讲解和代码实现(除了条件熵和信息增益)都基于两个随机变量的样本空空间,样本空间X={x1, x2}的概率分布如下所示:
p(x1) = p1, 0< p1 <1 p(x2) = p2, 0< p2 <1 p1 + p2 = 1
1.信息
1.1信息函数
信息是用来消除随机不确定性的东西,信息的公式如下所示
I(x) = -log(p(x), 2) , 其中p(x)就是随机变量x发生时的概率,x ∈ {x1,x2}
可知I(x1)就是随机变量x1的信息,I(x2)就是随机变量x2的信息。
1.2信息函数的python是实现
# -*- coding: utf-8 -*- """ @author: 蔚蓝的天空tom Talk is cheap, show me the code Aim:画出样本空间X={x1, x2}中随机变量变量x1的信息函数Info(x1)曲线图,因变量为p Info(x1) = -log2(p) 已知p(x1)=p, p(x2)=1-p, 0<= p <= 1 """ import numpy as np import math import matplotlib.pyplot as plt def log_ele(x, n): ''' 表达式x的logn函数 log(x, n) :param x:表达式 :param n:log的底 ''' if 0 >= x: return 0 else: return math.log(x, n) def log_func(X, n): ''' logn函数的向量化 :param X:向量X :param n:log的底 ''' func = np.frompyfunc(log_ele, 2, 1) return func(X, n) #画以概率p为因变量的随机变量的信息曲线 def plot_information(): ''' 样本空间:X={x1, x2} 概率密度:p(x1) = p, p(x2) = 1 - p, 0.0<= p <=1.0 ''' p = np.arange(0.0, 1.01, 0.01) ''' [ 0. 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1. ] ''' info_x1 = -1 * log_func(p, 2) #x1的信息 #plot x1's information and x2's information in the coordinate system x = p y = info_x1 plt.figure(1) plt.grid(True) plt.title('random variable x1\'s information') plt.xlabel('p') plt.ylabel('random variable x1\'s information') plt.ylim(min(y.min(), y.min()), max(y.max(), y.max())+1) plt.xlim(x.min() - 0.1, x.max() + 0.1) plt.plot(x, y, c='red',label='Info(x1)=-log2(p)') plt.legend(loc = 'upper right') plt.show() if __name__=='__main__': plot_information()
1.3信息函数的曲线图(变量概率p为因变量)
从图上可以知道样本空间中的随机变量x1的信息是随着x1的发生概率p的增大而减小下。可知随机变量的概率越大,此信息变量的信息会越小,此随机变量的不确定性就越小。
2.香农熵(Shannon Entropy)
2.1香农熵公式
从概率论的角度看,香农熵是样本空间内所有随机变量的信息的期望,香农熵的公式如下所示:
H(X)=p(x1)I(x1) + p(x2)I(x2), 其中X是样本空间{x1, x2},p(x1)是x1发生时的概率,p(x2)是x2发生时的概率,I(x1)是x1的信息,I(x2)是x2的信息
2.2香农熵的意义
1)香农熵只依赖样本空间X的分布
2)香农熵和样本空间X内的所有的样本取值没有任何关系
3)香农熵用来度量随机变量的不确定性
4)熵越大,概率说明X的不确定性越大
5)熵越小,概率说明X的不确定性越小
6)熵,就是不确定性的度量!
应用:在机器学习分类中用到香农熵,熵越到说明这个类别的不确定性越大,反之越小。
下面以本章中的样本空间为例,画出香农熵以概率p为因变量的变化曲线,其中p(x1)=p, p(x2) = 1 - p,0<= p <= 1。
2.3香农熵的python实现
# -*- coding: utf-8 -*- """ @author: 蔚蓝的天空tom Talk is cheap, show me the code Aim:画出样本空间X={x1, x2}的香农熵函数图H(X) = -p*log2(p) - (1-p)*log2(1-p),因变量为p 已知p(x1)=p, p(x2)=1-p, 0<= p <= 1 """ import numpy as np import math import matplotlib.pyplot as plt def log_ele(x, n): ''' 表达式x的logn函数 log(x, n) :param x:表达式 :param n:log的底 ''' if 0 >= x: return 0 else: return math.log(x, n) def log_func(X, n): ''' logn函数的向量化 :param X:向量X :param n:log的底 ''' func = np.frompyfunc(log_ele, 2, 1) return func(X, n) def plot_shannon_entropy(): ''' 画以概率p为因变量的香农熵曲线H(X) = -p*log2(p) - (1-p)*log2(1-p) 样本空间:X={x1, x2} 概率密度:p(x1) = p, p(x2) = 1 - p, 0.0<= p <=1.0 ''' p = np.arange(0.0, 1.01, 0.01) ''' [ 0. 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1. ] ''' I1 = -1 * log_func(p, 2) #x1的信息 I2 = -1 * log_func(1-p, 2) #x2的信息 shannon_entropy = p*I1 + (1-p)*I2 #样本空间X的香农熵 #画图香农熵函数,H(X) = -p*log2(p) - (1-p)*log2(1-p) x, y= p,shannon_entropy plt.figure(1, figsize=(8,6)) plt.grid(True) plt.title('shannon entropy of {x1, x2}, p(x1)=p is dependent variable') plt.xlabel('p') plt.ylabel('H(X) = -p*log2(p) - (1-p)*log2(1-p)') plt.ylim(y.min(), y.max() + 0.2) plt.plot(x, y, c='red', label='shannon_entropy(X) = -p*log2(p) - (1-p)*log2(1-p)') plt.legend(loc='upper left') plt.show() if __name__=='__main__': plot_shannon_entropy()
2.4香农熵的曲线图(以随机变量x1的概率p为因变量)
从图上可以知道:
1)当p=0或者p=1时,样本空间X的香农熵取值最小为0,则此时概率地说此时的样本空间不确定性最小;
2)当p=0.5时,样本空间X的香农熵取值最大,则此时可以概率地说此时的样本空间不确定性最大。
3)在0<p<=0.5范围内,随着随机变量x1的概率值p增加,样本空间X的香农熵增大,则可以说样本空间的不确定性也在增大
4)在0.5=<p<=1范围内,随着随机变量x1的概率值p增加,样本空间X的香农熵减小,则可以说样本空间的不确定性也减小
3.条件熵
此处只拿出部分内容,介绍条件熵的计算步骤:
3.1.样本数据集
样本集简介:
样本集有8个example样本
每个样本有3个特征(身高,房子,性格),1个分类结果refuse或者agree
身高取值范围={high, low}
房子取值范围={no, yes}
性格取值范围={good, bad}
分类标签=相亲结果={refuse,agree}
样本号 |
X=身高 |
X=房子 |
X=性格 |
Y=相亲结果 |
1 |
high |
no |
good |
refuse |
2 |
high |
no |
good |
refuse |
3 |
high |
yes |
good |
agree |
4 |
low |
yes |
good |
agree |
5 |
low |
yes |
good |
agree |
6 |
low |
yes |
bad |
refuse |
7 |
low |
yes |
bad |
refuse |
8 |
low |
Yes |
Bad |
refuse |
3.2分类样本空间 Y=相亲结果
样本变量 |
refuse |
agree |
|
样本分布 |
refuse=5 |
agree=3 |
|
概率分布 |
P(y=refuse)=5/8 |
P(y=agree)=3/8 |
|
3.3样本空间 X=身高
3.3.1条件样本空间 X=身高
样本变量身高特征 样本分布(cnt=8) 概率分布 |
high 3 P(身高=high)=3/8 |
low 5 P(身高=low)=5/8 |
|
|
|
|
|
样本变量Y|X=high 样本分布(cnt=3) 概率分布 |
Y=refuse|X=high refuse|high = 2 p(refuse|high)=2/3 |
Y=agree|X=high agree|high = 1 p(agree|high) = 1/3 |
H(Y|身高=high) -2/3log(2/3) -1/3log(1/3) |
样本变量 Y|X=low 样本分布(cnt=5) 概率分布 |
Y=refuse|X=low refuse|low = 3 p(refuse|low)=3/5 |
Y=agree|X=low agree|low = 2 p(agree|low)=2/5 |
H(Y|身高=low) |
3.3.2计算条件熵H(Y=相亲结果| X=身高)
有了上面的统计后,我们可以计算条件熵了。
我们想要求出当已知身高的条件下的分类样本空间Y的条件熵。
而条件熵是一个变量Y熵对X(条件)的期望:
- H(Y={refuse,agree}|X=身高)
- = p(身高=high) * H(Y|身高=high) + p(身高=low) * H(Y|身高=low)
- =(3/8) * {-2/3log(2/3) -1/3log(1/3)} + (5/8)* {-3/5log(3/5) -2/5log(2/5)}
Python计算如下:
(3/8) * (-2/3*math.log2(2/3) -1/3*math.log2(1/3)) + (5/8) * (-3/5*math.log2(3/5) -2/5*math.log2(2/5)) Out[60]: 0.9512050593046015 |
4.信息增益
以3.条件熵中用到的相亲样本集为例,继续讲解信息增益。
4.1样本集的香农熵
n_samples = 8
n_refuse = 5
n_agree = 3
p(y=refuse) = n_refuse/n_samples = 5/8
p(y=agree) = n_agree/n_samples = 3/8
H(Samples) = -p(y=refuse)*log2(p(y=refuse)) - p(y=agree)*log2(y=agree) =-(5/8)*log2(5/8) -(3/8)*log2(3/8)
Python计算结果如下:
-(5/8)*math.log2(5/8) -(3/8)*math.log2(3/8) Out[63]: 0.954434002924965
4.2条件样本空间 X=身高={high, low}时的条件熵
condition_entropy(Y={refuse, agree} | X=身高={high, low}) = p(身高=high) * H(Y|身高=high) + p(身高=low) * H(Y|身高=low) =(3/8) * {-2/3log(2/3) -1/3log(1/3)} + (5/8)* {-3/5log(3/5) -2/5log(2/5)}
python计算结果如下:
(3/8) * (-2/3*math.log2(2/3) -1/3*math.log2(1/3)) + (5/8) * (-3/5*math.log2(3/5) -2/5*math.log2(2/5)) Out[60]: 0.9512050593046015
4.3信息增益
条件空间样本X=身高={high, low}时,信息增益计算公式如下所示:
Gain(X=身高={high, low}) =shannon_entropy(samples) - condition_entropy(Y={refuse, agree} | X=身高={high, low}) =H(Y={refuse, agree}) - H(Y={refuse, agree}|X=身高={high, low}) =0.954434002924965 - 0.9512050593046015 =0.0032289436203635224
按照信息增益的计算公式,可以计算出:
Gain(X=身高={high, low}) = 0.954434002924965 - 0.9512050593046015 = 0.0032289436203635224 Gain(X=房子={yes, no}) = 0.954434002924965 - 0.896240625180289 = 0.058193377744676034 Gain(X=性格={good, bad}) = 0.954434002924965 - 0.6068441215341679 =0.34758988139079716
在实际使用中,将信息增益数值最大的特征作为决策树的根节点,可以使得基于此训练样本集得出的决策树最简洁有效。
根据上面的计算可知,将选取“性格”作为决策树的根节点,“房子”作为决策树的第二层节点,“身高”作为决策树的第三层节点。
5.经验熵
根据给定的已知样本集,计算样本集的香农熵,就是经验熵。
比如
投硬币游戏,得到如下样本集:
正面:6次
反面:8次
则根据本次的样本集,得到样本集的香农熵就是经验熵:
经验熵 =-p(正面)*log(p正面) -p(负面)*log(p负面) =-6/14*log2(6/14) -8/14*log2(8/14)
python计算得到:
-6/14*math.log2(6/14) -8/14*math.log2(8/14) Out[67]: 0.9852281360342516
6.经验条件熵
以5.经验熵为基础计算出来的条件熵,就是经验条件熵。
计算步骤详见3.条件熵
7.信息增益比
以4.信息增益中用到的相亲样本集为例,继续讲解信息增益比,以计算特征为身高的信息增益比过程为例:
Gain(X=身高={high, low}) = 0.003289436203635224
我们知道特征身高的样本空间以及概率密度分布如下所示:
样本变量身高特征 样本分布(cnt=8) 概率分布 |
high 3 P(身高=high)=3/8 |
low 5 P(身高=low)=5/8 |
|
Entropy(X=身高) = -3/8*math.log2(3/8) - 5/8*math.log2(5/8) = 0.954434002924965
GainRatio(X=身高) = Gain(X=身高={high, low}) / Entropy(X=身高) = 0.003446478429681251
如果以特征的信息增益比作为选择决策树根节点的选择标准,则此算法就是C4.5算法
ID3算法只有树的生成,所以该算法生成的树容易产生过拟合。
C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来选择特征作为每个子树的根节点
C4.5算法的pyton实现软件系统请见:https://blog.csdn.net/u012421852/article/details/79808223
enjoy it~
(end)