毕业论文整理(二):用依赖树近似离散概率分布

《Approximating Discrete Probability Distributions with Dependence Trees》是一篇1968年的经典论文了,即使在2018年也有28次的引用量:

CLT.jpeg

是由两位IEEE大牛C.K. CHOW和C.N.LIU所写,所以通常都被称为“Chow-Liu Tree”、“周刘树”、“CLT”,或者叫“依赖树”。整篇论文一共就6页,虽然是6页,刚开始看得真的头大,完全不知道在讲什么,更别说用了,百度一下啥都不知道,最后到外网才找到一些资料。我本科也是做这个相关的内容,当时连分类和分割的区别都不懂,也没有人讲解强行上手,真是被坑哭了。本科大四的时候每天早上起来就硬盯着一遍一遍地重复看,终于才慢慢理解。举个例子:

Abstract —— A method is presented to approximate optimally an n-dimensional discrete probability distribution by a product of second-order distributions, or the distribution of the first-order tree dependence.

什么叫做second-order distribution,翻译成英文就得花费几倍的时间从公式反推才知道这是指的“二维分布”或者叫“二阶分布”而不是在讲“第二个顺序的分布”。

CLT要解决的事情

对于很多模式识别、学习系统来说,一个很重要的事情就是根据有限的数据集来估计整体n维联合概率分布。举个例子,有两个特征(花颜色、叶子密度),采集了一些数据集:(红色、密)→ 果实好吃,(黄色,稀)→ 果实好吃……,那么我想知道当花是什么颜色、叶子是什么密度,果实会好吃,如果估计出整体的二维联合概率分布,把公式一套进去,就能知道好吃的概率多大了。根据文章《A class of nonlinear recognition procedures》我们将联合概率分布估计为:
p_t.png

其中,(\(m_1\), … , \(m_n\))是未知的整数1到n的排列,\(P(x_i|x_0)\)定义为\(P(x_i)\),具备上述式子的概率分布我们称之为一阶树依赖概率分布。由集合\(\bold{x}=\{x_i|i= 1,2,…,n\}\)和映射j(i)组成的结构我们称之为这个分布的依赖树。以后都将会简写\(x_{m_i}\)为\(x_i\)。由于一共有\(\frac{n(n-1)}{2}\)个二阶近似乘积项,只有n-1个会被选择,所以如何选择出使得整体最逼近的乘积项就是CLT的核心问题。举个例子,一个联合概率分布\(P(x_1, x_2, x_3, x_4, x_5)\)可以被近似为:

joint.png

现在的问题就是要求得最佳的排列m=(1,2,3,4,5),使得整个的一阶二阶乘积估计最逼近整体联合概率分布\(P_t\)。

CLT将这个数学问题计算机化,把这个乘积式子按照如下规则转为了树:

  1. 每个变量\(x_i\)代表树的一个节点
  2. 如果有乘积项量\(P(x_a|x_b)\),则画一条从a指向b的箭头
  3. 如果有乘积项\(P(x_c)\),则没有从c节点出去的箭头

这样的依赖树有n-1条边,例如上述的依赖树应该画为:

CLT_example.png

寻找最优依赖树

我们设原始概率分布为\(P(\bold{x})\),估计的概率分布为\(P_a(\bold{x})\),\(\bold{x}\)是n维离散变量\(x_1, x_2, …, x_n\),那么要想知道估计逼近的程度,很容易用一个距离去度量两棵树的近似程度,CLT使用了前人使用过的相对熵(Relative Entropy)的概念。相对熵,也叫KL散度(Kullback-Leibler Divergence, KLD),经常被用来描述两个分布的差异。于是\(P\)和\(P_a\)的差异可以定义为:

I_p_pa.png

熵的值越小说明分布越接近,那么整个问题变为了:
给定一个n维概率分布\(P(x_1, x_2, …, x_n)\),\(x_i\)是离散的,我们希望找到这个概率分布的依赖树\(P_\tau(x_1, x_2, …, x_n)\)使得对任意的\(t \in T_n\),有\(I(P, P_\tau) ≤ I(P, P_t)\)。其中\(T_n\)是所有可能的依赖树,这个\(\tau\)就被成为最优依赖树。

对于n个节点来说,一共可能产生\(n^{n-2}\)棵不同的树,就不要妄想去遍历了。CLT做了两个定义。

【定义一】对于变量\(x_i\)和\(x_j\)来说,互信息\(I(x_i, x_j)\)定义为:

I_xi_xj.png
这是互信息的一个普遍定义,互信息值非负。然后CLT将这个互信息作为节点之间的权重赋予在每个分支上面。

【定义二】对于\(T_n\)中全部的依赖树\(t^’\),一棵最大权值依赖树是符合如下条件的依赖树:
condition.png

很容易理解这就是一个贪心,详细的证明在原论文上给出了,我也推导过一次。

用这两个定义,通过一系列的变换,熵被变换为了:
I_p_pt.png

后两项是独立于依赖树的常量,因此要想使得分布越逼近,就要使得熵最小;要想使得熵最小,就要使得依赖树的权值和最大,也就是寻找一棵以互信息为权值、变量为节点的最大生成树作为依赖树。这就可以借鉴像Kruskal之类的最小生成树的算法了。

依赖树寻找实例

考虑如下二值四维联合概率分布:

\(x_1 x_2 x_3 x_4\) \(P(x_1,x_2,x_3,x_4)\) \(P(x_1)P(x_2)P(x_3)P(x_4)\)
0000 0.100 0.046
0001 0.100 0.046
0010 0.050 0.056
0011 0.050 0.056
0100 0.000 0.056
0101 0.000 0.056
0110 0.100 0.068
0111 0.050 0.068
1000 0.050 0.056
1001 0.100 0.056
1010 0.000 0.068
1011 0.000 0.068
1100 0.050 0.068
1101 0.050 0.068
1110 0.150 0.083
1111 0.150 0.083

例如第1行的含义是,\(P(x_1=0,x_2=0,x_3=0,x_4=0)\)=0.100。我们通过累加来求得一阶和二阶边缘概率分布,例如\(P(x_1=0)=P(x_1=0,x_2,x_3,x_4)\):

0 1 00 01 10 11
\(P(x_1)\) 0.450 0.550 - - -
\(P(x_2)\) 0.450 0.550 - - -
\(P(x_1, x_2)\) - - 0.300 0.150 0.150

然后根据互信息公式计算互信息,例如:
I_x1_x2.png

于是得到了:

互信息
\(I(x_1,x_2)\) 0.079
\(I(x_1,x_3)\) 0.00005
\(I(x_1,x_4)\) 0.0051
\(I(x_2,x_3)\) 0.189
\(I(x_2,x_4)\) 0.0051
\(I(x_3,x_4)\) 0.0051

我们只需要选择4-1=3条边,就能把4个节点连起来了,按照从大到小排序(\(x_2 \rightarrow x_1\))、(\(x_3 \rightarrow x_2\))必选,剩余三条边都是相同的权值,会按照一些排序算法随机地选择剩余的3条中的一条,生成的依赖树如图(实现代表真实选择,虚线代表可能替换选择,灰色代表不选择):

generated_CLT.png

于是整体分布可能被估计为:\(P(x_1,x_2,x_3,x_4)=P(x_1)P(x_2|x_1)P(x_3|x_2)P(x_4|x_1)\),我们可以去计算它的概率分布值,例如:

estimate.png

得到如下三种方案的对比表:

\(x_1 x_2 x_3 x_4\) \(P(x_1,x_2,x_3,x_4)\) \(P(x_4|x_1)\) \(P(x_4|x_2)\) \(P(x_4|x_3)\)
0000 0.100 0.130 0.104 0.104
0001 0.100 0.104 0.130 0.130
0010 0.050 0.037 0.030 0.037
0011 0.050 0.030 0.037 0.030
0100 0.000 0.015 0.015 0.012
0101 0.000 0.012 0.012 0.015
0110 0.100 0.068 0.068 0.068
0111 0.050 0.054 0.055 0.055
1000 0.050 0.053 0.052 0.052
1001 0.100 0.064 0.065 0.065
1010 0.000 0.015 0.015 0.018
1011 0.000 0.018 0.019 0.015
1100 0.050 0.033 0.040 0.032
1101 0.050 0.040 0.032 0.040
1110 0.150 0.149 0.182 0.182
1111 0.150 0.178 0.146 0.146

三种方案的熵都是0.094,几乎接近于0,已经非常近似了。

边缘概率分布的近似

上面的例子先给出联合概率分布,再去求的边缘概率。实际中我们本来要求的就是联合概率分布,所以只能利用样本去近似边缘概率。很容易想到计数的方法:

f_uv.png
\(n_uv\)是\(x_i=u, x_j=v\)的样本简单计数,就能够得到互信息的估计了,由于熵公式只是对互信息线性求和,所以直接用这个估计替代互信息即是熵的估计了。

在实际操作中还会遇到问题,那就是样本量为0的时候会发生除以0的情况,这时候需要预处理样本,所有取值样本数+1,这样不会影响整体分布,又避免了除以0的问题。我在另外的算法里看见过这种处理,因此沿用了过来。

模式识别实例

我们采集了19000张手写数字0-9图片,将其图像数据二值化,希望通过计算机模式识别输入图像输出数字到底是几:

numbers.png

一共有c=10个类别,假设用\(a_i\)标记第i个类别,\(\bold{p}=(p_1, …, p_c)\)表示先验概率分布,先验概率可以通过计数简单地进行估计;对于输入的二值特征向量\(\bold{x}=(x_1, …, p_n)\),如果一个样本的特征向量符合:

vector_condition.png

那么就判别这个样本为第k个类别。问题的关键转变为求条件概率\(P(\bold{x}|a_i)\)的分布。按照字面理解,就是在0-9的数字出现的条件下, 特征向量x出现的概率有多大。于是我们的问题可以化为求解:

p_x_ai.png

也就是求在给定\(a_i\)类别下,特征向量取值的联合概率分布函数,这个分布函数就用CLT来求解,最后的数字“4”的CLT图像是这样的:

4_CLT.png

整个流程就走通了。

NAFs如何结合CLT

先用CLT进行一次“粗分割”,确定大致边界,再利用NAFs去精细分割。

毕业论文整理(二):用依赖树近似离散概率分布

https://www.bananaoven.com/posts/45716/

作者

香蕉微波炉

发布于

2018-11-27

更新于

2018-11-27

许可协议