先说说熵的定义,假设我们有随机变量 x ,其概率分布为 p(x) ,则其熵为:
条件熵:
可以证明,在概率相等的时候,熵可以达到最大值。也可以理解为“最混乱”。
一般情况下,如果对一个事物没有任何的先验知识,我们倾向于用“平均概率”去估计它。比如,对于一个骰子,如果事先不知道其内部信息,则我们倾向于说如果抛掷它得到每种点数的概率是相等的。
如果我们知道了某些先验信息,比如某一个面抛出的概率高一些,也就是有了约束,那么我们倾向于说在“该面有较高的概率”这个约束条件下,剩下的那些面概率相等。
这相当于“将猜测每个面出现的概率”这个举动的风险降低到最小。
上面这种说法按照熵的语言来讲,就是最大熵。
假设我们研究的是分类问题,想要用模型来描述原始数据分布的 P(y|x) 。
这里,我们将约束抽象为约束函数,也就是说,满足某种条件的数据点 (x,y) ,约束函数 f 的值就是1,否则为0。
函数 fi(x,y) 在训练集的数学期望:
函数 fi(x,y) 在原始数据集的数学期望:
我们建模的目的,就是希望用训练集可以表示原始数据集某些规律。所以我们可以让上面两个期望相等:
由于我们希望得到的模型最大可能地模拟原始的数据分布,通过贝叶斯公式,用 P˜(x)P(y|x) 来近似 P(x,y) 。得到:
上面说到,设置好约束条件后,我们希望模型的熵最大,这相当于风险最小。这样,我们就得到了这里分类问题(求的是条件概率,所以算条件熵)最大熵模型的形式:
等价于:
这是一个等式约束优化问题。可以用拉格朗日乘子法。拉格朗日函数:
原始问题:
对偶问题:
求偏导:
注意,我们求的是 P(y|x) , 这是一个确定的值,也就是给定某一个 x ,它分类到某一确定类别 y 的概率是多少。既然是确定的,那么上面式子如果求偏导后关于 x 和 y 的求和符号应该就没有了。或者说,可以认为这里的 P(y|x) 并不是一个未知数,而是好多个,是 P(y1|x),P(y2|x),P(y3|x)… 。这里我认为网上的教程以及李航的《统计学习方法》里面没有表述清楚。所以我这里用 P(yi|x) 来表示。
令导数为0,并且注意到 P˜(x)>0 ,得:
记规范化因子 Z(x)=exp(1−α0P˜(x)) :
由 ∑yP(y|x)=1 得:
将 P(y|x) 表达式代入对偶问题,就只剩下未知数 α 了,再优化出令目标函数值最大的 α ,反过来求的 P(y|x) 就是最优的。注意,上面说求导是针对 P(yj|x) 求的,那么 P(yj|x) 之间的不同是由什么控制的呢?当然是由 fi(x,yj) 控制了。
具体的优化 α 的算法可以参考 http://blog.csdn.net/itplus/article/details/26550369 。