基于随机变量的熵来进行数据建模和分析

转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer


写在前边的话

首次接触信息熵,信息增益的概念是在阅读《机器学习实战》这本书的时候了解到的,那个时候对这几个概念还是一知半解,虽然当时可以理解,但是记忆却保持不了太久,几个月后,再次阅读一个数据专家的代码时发现人家对于用户异常行为检测的算法模型采用的就是随机变量的熵来建模的   机器学习实战系列博客:http://blog.csdn.net/Gamer_gyt/article/category/5848553   本文永久地址:http://blog.csdn.net/gamer_gyt/article/details/53729868


何为信息/熵/信息增益信息

信息是熵和信息增益的基础概念,引用香农的话就是事物运动状态或存在方式的不确定性的描述,然而当你读完这句话的时候感觉还不如不告诉你呢,当然香农大神的话岂能是那么容易理解的,因为我是从机器学习中的决策树算法知道信息,熵,信息期望这几个概念的,那么我就从分类的角度来看下什么是信息。   假设现在有一个随机变量X,当我们看到他的一个值时,能给我们带来多少信息呢?这个信息就可称为我们观察到X这个值带来的惊讶程度,我们被告知一个不太可能发生的事情发生了,要比告知一个非常可能发生的事情发生了得到的信息更大。所以信息量的多少依赖于概率分布p(x),所以我们可以使用一个函数来建模信息量h(x)   我们观察两个相互独立的事件x,y。我们观察他得到的信息量,要和单独观察他们得到的信息量之和相等,即h(x,y)=h(x) + h(y)   而两个独立的时间x,y的概率关系:p(x,y)=p(x)p(y)   基于上边的观察,信息量必须和p(x)和log函数有关,所以有h(x)=-log2p(x)   这里加上负号的原因是保证信息量大于等于0,注意这是一个小概率事件,具有更高的信息量,log底数的选择并没有限制,信息论中大多都选择2,传输这些信息量,需要的二进制的位数。   直接一点就是:如果待分类的事务可能分在多个分类之中,则符号x的信息定义为h(x)=-log2p(x) p(x)表示选择该分类的概率。  

信息熵

熵定义为信息的期望值,即用来接收每条消息中包含的信息的平均值,它是用来度量不确定性的,它可以表示为关于分布p(x)的期望值     这个表达式就被称为信息熵   在机器学习中,采用比较多的是自然对数形式

      对于x=0,由于            所以我们让p(x)ln(x) = 0   如果对这些信息量进行编码传输,我们希望概率大的使用较短的编码,概率小的我们采用较长的编码,那么最大熵能够达到最小长度的编码。   读到这里你或许会不明白,为什么定义概率大的使用较短的编码,概率小的采用较长的编码,就能得到最大熵能够达到最小的编码,下边我们通过数学来验证一下:   为了便于求导,这里的信息熵公式采用:     假设f(x) = xIn(x),看看图像长什么样,由信息熵的公式及定义,x 这里表示的事件发生的概率,x 属于[0,1],对函数f(x)求导   ,由此发现f(x)是凸函数,令 得 由于 ,我们定义f(0)=0,所以这里得到的f(x)=xIn(x) 的图像如下:   

  由于信息熵公式前边带了个负号,所以这里图像应该取反,所以熵最大时,即函数最大时对应最小长度的编码

信息增益

信息增益在决策树中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好,在概率中定义为:待分类的集合的熵和选定某个特征的条件上之差,在解释这个公式之前,我们先来看下条件熵: 假设有随机变量(X,Y),其联合概率分布为:P(X=xi,Y=yi)=pij,i=1,2,?,n;j=1,2,?,m则条件熵(H(Y∣X))表示在已知随机变量X的条件下随机变量Y的不确定性,其定义为X在给定条件下Y的条件概率分布的熵对X的数学期望: 那么信息增益表示得知特征X的信息后而使得Y的不确定性减少的程度。定义为:


熵和编码长度

网上看到一篇文章解释熵和编码长度的关系特别贴切,举得例子是:假设有个作弊团伙,需要源源不断的向外传递4选1的单选题的答案,直接传输ABCD的ascii编码的话,每个答案需要8个bit的二进制编码,从传输的角度,这显然有些浪费,信息论最初要解决的就是数据传输和压缩的问题,所以这个作弊团伙希望能用更少bit的编码来传输答案,很简单,答案只有四种可能性,所以二进制编码需要的长度就是取2为底的对数log2(4)=2bit就足够进行四个答案的编码了(00,01,10,11)在上面这个例子中,其实隐含了一种假设,就是四个答案出现概率是相等的,均为p=1/4,所以编码需要长度的计算可以理解为如下的形式: 此时已经有些熵的定义了,看上边的熵的分析就是求信息(-log2(p))的期望值 这正是熵,因为ABCD出现的概率均为p=1/4,所以上面式子算出来结果刚好是2。从这个角度,熵就是对每个可能性编码需要长度的期望值。

答案出现概率相等的例子可能并不贴近实际,在中国考试界,坊间传闻:“不知道选什么的时候就蒙C”,这个信息是可以帮助作弊团队改善编码长度的。假设A出现的概率不变仍为1/4,C出现的概率变成了1/2,B和D则分别是1/8:P(A)=1/4,P(B)=1/8,P(C)=1/2,P(D)=1/8。在这种情况下,考虑到传递答案的过程中,C出现的次数(概率)最高,所以可以为C用短一些的编码,而出现次数较少的B和D则可以考虑用长一些的编码。这样的话,平均下来,对于一定的信息总量,需要的编码总长度就会少一些。根据熵的定义的思路,对于出现概率为p的事件,考虑用长度为-log2(p)的二进制进行编码,所以考虑如下编码:

A:10 B:110 C:0 D:111

对照熵的公式计算一下编码的长度的期望值,也就是平均编码长度:

再详细点,假设作弊团伙要传递200个答案出去。为了方便说明,这200个答案中ABCD出现的次数恰好都严格和其出现概率成比例,也就是A:50次,B:25次,C:100次,D:25次。所以传递200个答案一共需要的bit数是: 50×2+25×3+100×1+25×3=350

那么平均下来每个答案耗费了350/200=1.75个bit编码长度。

在实际情况中,并不是每个信息都可以单纯按照上面的两个例子进行二进制编码。比如一个事件出现概率为0.3,那么我们也不知道该如何用一个-log2(0.3)=1.74个bit的二进制编码表示。但是平均编码长度的概念是可以拓展的,代表了对随机变量的平均不确定度的度量。比如ABCD四个答案出现概率相等时,是一种最无序最不确定的状态,谁也蒙不准下一个答案是什么;但是如果C出现概率高了,那么答案出现就不是那么没规律,我们蒙C时的信心就高了一些。


基于随机变量的熵进行数据建模

比如说场景是这样的:某公司又一台服务器,rsyslog中记录着所有用户的访问记录,包括访问时间,访问地点,访问ip三个维度,当时真实场景中并不仅仅是这三哥数据维度,但是这里我们为了举例

假设这里有以下这些数据:

用户姓名访问时间访问地点访问IP A8北京10.0.0.3 A9北京10.0.0.2A10北京10.0.0.2 A14北京10.0.0.4

第一步:制定参数

thread=0.95 (经验阈值) max_bucket=2(遍历属性值的最多数目)

第二步:构建用户肖像

A:{time:{8:0.25,9:0.25 },address:{北京:1},IP:{10.0.0.2:0.5,10.0.0.3:0.25} } }

第三步:异常值计算

针对一条测试数据 A 10 北京 10.0.0.12 遍历测试数据的没个维度: 如果该维度不在 肖像数据中: 计算该维度的概率编码长度(1-sum(该维度对应的概率和)) 相加各个不在肖像数据维度值中的编码长度期望值 最终得到一个异常值和,便是该用户的异常指数

这里讲的不是太清楚,主要是公司的业务场景不能透漏,这里主要是进行了简化,如果你感兴趣或者有什么不懂的地方可以加我微信,进行交流


推广一下个人微信公众号:

既有美妙的风景,也会有称不上景只有风的地方。

基于随机变量的熵来进行数据建模和分析

相关文章:

你感兴趣的文章:

标签云: