欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习中的熵

程序员文章站 2024-02-11 16:54:16
...

信息量

香农认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量大小就是看这个信息消除不确定性的程度。
“太阳从东方升起了”这条信息没有减少不确定性。因为太阳肯定从东面升起。这是句废话,信息量为0。
“吐鲁番下中雨了”,这条信息比较有价值。
太阳明天从东方升起的概率是 100%,吐鲁番下中雨的概率是2%。事件发生的概率越大,说明事件发生的确定性越大。吐鲁番下雨这个事件,直接消除98%不下雨的事件,即消除不确定性的程度很大,所以信息量大。
从上面两个例子看出:信息量的大小和事件发生的概率成反比 定义:h(x)=log(p(x))h(x)=-log(p(x)) 信息量 h(x)h(x)和事件发生的概率成反比且H(x)>=0

信息熵

1.定义: 信息熵是信息量的数学期望
H(x)=p(x)h(x)=p(x)log(p(x))H(x)=∑p(x)*h(x)=-∑p(x)log(p(x))
信息熵越大,系统的不确定性会越大,混乱程度也越大。当随机分布为均匀分布时,熵最大

联合熵和条件熵

联合熵

对服从联合分布为p(x,y)的一对离散随机变量(x,y),其联合熵H(x,y)可以表示为:
H(X,Y)=xyp(x,y)log(p(x,y))H(X,Y)=-\sum_{x}\sum_{y}p(x,y)log(p(x,y))

条件熵

在决策树中ID3中得出全部特征下的全部变量的条件熵,选择条件熵大的,(随机变量或者系统不确定性大的),即传递的信息量大(有用的信息多)的作为划分点
条件熵H(Y|X)表示已知随机变量X的条件下随机变量Y的不确定性
定义为:H(YX)=ip(xi)H(YX=xi)H(Y|X)=\sum_{i}p(x_i)H(Y|X=x_i)
推导:
机器学习中的熵

相对熵和交叉熵

相对熵被称为KL散度
我们对于同一个随机变量x的两个单独的概率分布P(x)和Q(x),可以使用相对熵(KL散度)来衡量两个分布之间的差异
D(PQ)=xP(x)log(P(x))xP(x)log(Q(x))D(P||Q)=\sum_xP(x)log(P(x))-\sum_xP(x)log(Q(x))
D(QP)=xQ(x)log(Q(x))xQ(x)log(P(x))D(Q||P)=\sum_xQ(x)log(Q(x))-\sum_xQ(x)log(P(x))
在机器学习中,我们一般是选择使得真实值YY和预测值YpredY^{pred}分布之间差异最小的模型作为最优模型,即D(YYpred)D(Y||Y^{pred})最小。又因为yP(y)log(P(y))\sum_yP(y)log(P(y))是一个常量,故在优化过程中我们只需要关注后半部分即可。后半部分被称为交叉熵,
交叉熵 (交叉熵越小越好)
H(Ytrue,Ypred)=xYtrue(x)log(Ypred(x))H(Y^{true},Y^{pred})=-\sum_xY^{true}(x)log(Y^{pred}(x))

实战

import pandas as pd
import numpy as np
data=pd.read_csv('watermelon_3a.csv')
data.head()
Idx color root knocks texture navel touch density sugar_ratio label
0 1 dark_green curl_up little_heavily distinct sinking hard_smooth 0.697 0.460 1
1 2 black curl_up heavily distinct sinking hard_smooth 0.774 0.376 1
2 3 black curl_up little_heavily distinct sinking hard_smooth 0.634 0.264 1
3 4 dark_green curl_up heavily distinct sinking hard_smooth 0.608 0.318 1
4 5 light_white curl_up little_heavily distinct sinking hard_smooth 0.556 0.215 1
data.label.value_counts()
0    9
1    8
Name: label, dtype: int64
from collections import Counter
def shannonEnt(dataSet):
    num=dataSet.shape[0]
    counter=Counter(dataSet)
    entropy=0.0
    for key,count in counter.items():
        p=count/num
        entropy+=-p*np.log2(p)
    return entropy
shannonEnt(np.array(data.label))
0.99750254636911528