基于最小错误率的贝叶斯决策

  本文主要参考资料

  最小错误率是在统计的意义上说的,请注意其含义。
  在这里要弄清楚条件概率这个概念。P(*|#)是条件概率的通用符号,在“|”后边出现的#为条件,之前的*为某个事件,即在某条件#下出现某个事件*的概率。P(ωK|X)是表示在X出现条件下,样本为ωK类的概率。
  一个事物在某条件下出现的概率P(*|#)与该事件在不带任何条件下出现的概率(写成P(*))是不相同的。例如全世界人口有60亿。因此你见到一个人在不带任何条件下,有20%的可能性是中国人P(*)=0.2,但是如果你在中国,或香港、台湾,那么中国、香港、台湾都是指一种条件(#),这种地理条件下,你所见到的某一个人是中国人(*)的概率就要大得多,此时P(*|#)就应该大于20%,甚至更多了。
  下面先讨论一个例子——癌细胞的识别,以此说明解决问题的过程。假设每个要识别的细胞已作过预处理,并抽取出了d个特征描述量,用一个d维的特征向量X表示,识别的目的是要依据该X向量将细胞划分为正常细胞或者异常细胞。这里我们用ω表示是正常细胞,而ω则属于异常细胞。
  类别的状态是一个随机变量,而某种状态出现的概率是可以估计的。概率的估计包含两层含义,一是由统计资料表明,正常细胞与异常细胞在统计意义上的比例,这称为先验概率P(ω1)及P(ω2),另一种则分别表示所检查细胞呈现出不同属性的概率密度函数P(x|ω1)和P(x|ω2),显然在一般情况下正常细胞占比例大,即P(ω1)>P(ω2),因此如果我们不对具体的细胞化验值作仔细观察,我们作出该细胞是正常细胞的判决,在统计的意义上来说,也就是平均意义上说,错判可能性比判为异常细胞时小。但是仅按先验概率来决策,就会把所有细胞都划归为正常细胞,并没有达到将正常细胞与异常细胞区分开的目的。这表明由先验概率所提供的信息太少。
  为此我们还必须利用对细胞作病理分析所观测到的信息,也就是所抽取到的d维观测向量。为简单起见,我们假定只用其一个特征进行分类,即d=1,并已知这两类的类条件概率密度函数分布已知,如图2.1所示,其中P(x|ω1)是正常细胞的属性分布,P(x|ω2)是异常细胞的属性分布。那末,当观测向量为X值时,它属于各类的概率又是多少呢?为此我们可以利用贝叶斯公式, 来计算这种条件概率,称之为状态的后验概率P(ωi|X)。

  Bayes(贝叶斯)公式是根据联合概率这一概念推出的,同时出现两个事件X及ωi的概率为P(x,ωi)。它是某个条件出现的概率(如P(ωi)),以及在此条件下某事件出现概率(P(x|ωi))的乘积,在此写为:
  P(x,ωi)=P(x|ωi)P(ωi)=P(ωi|x)P(x) 。先验概率是针对ωi,I=1,2,…,c,这c个事件出现的可能性而言的,不考虑其它任何条件。例如世界上有60亿人口,而中国人口12亿,因此不管其它条件,应有20%的可能是中国人。
  类条件概率密度函数P(x|ωi)是指ωi条件下在一个连续的函数空间出现X的概率密度,在我们这里指第ωi类样本他的属性X是如何分布的。
  (2-1)式表明,在得到一个待识别量的观测状态X后,我们可以通过先验概率P(ωi)及类别条件概率密度函数P(x|ωi),得到呈现状态X时,该样本分属各类别的概率,显然这个概率值可以作为我们识别对象判属的依据。上例中图2.1表示的类条件概率可用式(2-1)换算成如图2.2所示的后验概率分布。可以看出,在X值小时,细胞被判为正常是比较合理的,判断错误的可能性小。基于最小错误概率的贝叶斯决策理论就是按后验概率的大小作判决的。这个规则又可以写成如下几种等价形式:

(1) 如果 ,则 (2-2)
(2) 如用先验概率及类条件概率密度函数表示,则有:

  如果 , 则 (2-3)
  (3) 以比值的方式表示,
  如果 ,则 ,否则 (2-4)
  (4) (2-4)式还可改写成为对数形式,若
  
  则 ,否则 (2-5)
  其中(2-4)式中的l(x)在统计学中称为似然比,而称为似然比阈值。而式(2-5)中h(x)是似然比写成相应的负对数形式。它的好处是,与利用(2-4)式本身相比较,进行计算更为方便。

  下面举一数值例子。
  例2.1
  假设在某地区切片细胞中正常(ω1)和异常(ω)两类的先验概率分别为P(ω1)=0.9,P(ω2)=0.1。现有一待识别细胞呈现出状态x,由其类条件概率密度分布曲线查得p(x|ω1)=0.2,p(x|ω)=0.4,试对细胞x进行分类。
  解:利用贝叶斯公式,分别计算出状态为x时ω1与ω的后验概率
  
而 
  根据贝叶斯决策(2-2)则有
  P(ω1|x)=0.818>P(ω|x)=0.0182
  因此判定该细胞为正常细胞比较合理。
  从这个例子可以看出,尽管类别ω呈现出状态x的条件概率要高于ω1类呈现此状态的概率,但是考虑到P(ω1)远大于P(ω),因此状态x属于类别ω1的可能性远比属于类别ω的可能性大。将该细胞判为正常在统计的意义上讲出错率要小得多。
  还要强调一下条件概率这个概念。我们举出两对概率,一对是P(ω1|x)和P(ω|x),另一对是P(x|ω1)和P(x|ω1)。从表面上看,只是条件符号两边的项对换了位置,但实质上却有很大区别。前一对是在同一条件x下,比较ω1与ω2出现的概率,如果我们只考虑两类ω1和ω2,则有P(ω1|x)+P(ω2|x)=1。而对两者进行数值上的比较,如P(ω1|x)> P(ω2|x)则可以下结论,在x条件下,事件ω1出现的可能性大。
  对后一对概率来说,与第一对完全不同,因为它们是在不同条件下讨论的问题因此比较两者没有意义,而且即使只有两类ω1与ω2,P(x|ω1)+P(x|ω1)≠1。这里要特别强调一点是P(x|ω1)与P(x|ω2)两者没有联系,都是指各自条件下出现x的可能性,不能仅因为前者比后者大,就认为x是第一类事物的可能性较大,只有考虑先验概率这一因素,才能决定x条件下,ω1类还是ω2类的可能性比较大。
  另外大家可能觉得比较奇怪,为什么后验概率要利用Bayes公式从先验概率和类条件概率密度函数计算获得。这是因为计算概率都要拥有大量数据才行。在估计先验概率与类条件概率密度函数时都可搜集到大量样本,而对某一特定事件(如x)要搜集大量样本是不太容易的。因此只能借助Bayes公式来计算得到。
  对基于最小错误率的贝叶斯决策来说,以后验概率值的大小作判据是最基本的方法,而其它形式的作用都基本相同,但使用时更方便些。
以上讨论的是在两类情况下基于最小错误概率的贝叶斯决策规则,下面需证明按这种规则进行分类确实使错误率为最小。下面仅以一维情况来证明,其结果并不难推广到多维的情况。

  由于统计判别方法是基于统计参数作出决策,因此错误率也只能从平均的意义上讲,表示为在观测值可能取值的整个范围内错识率的均值。在连续条件下,平均错误率,以P(e)表示,应有
  (2-6)
  其中p(e,x)表示错误率为e观测值为x的联合概率密度,P(e|x)是观测值为x时的条件错误概率密度函数,P(x)为x值出现的概率,而积分运算则表示为在整个d维特征空间上的总和。在此一维情况下,x取从-∞到+∞的整个范围。
  在两类别问题中,按(2-2)式给出的决策规则,当P(w2|x)>p(w1|x)时决策为w2。显然这个决策意味着,对观测值x有P(w1|x)概率的错误率。例如在上例中所作的w1决策,实际上包含有P(w2|x)=0.182的错误概率。在两类别的情况下,可以将p(e|x)表示成当
  (2-7)
  如果我们把作出w1决策的所有观测值区域称为R1,则在R1区内的每个x值,条件错误概率为p(w2|x)。另一个区R2中的x,条件错误概率为p(w1|x)。因此平均错误率P(e)可表示成
  (2-8)
  由于在R1区内任一个x值都有P(w2|x)<P(w1|x),同样在R2区内任一个x值都有P(w1|x)<P(w2|x)错误率在每个x值处都取小者,因而平均错误率P(e)也必然达到最小,这就证明了按(2-2)式作出的决策,其平均错误率为最小。

  为了形象地说明以上证明,图2.3表示了在某种概率分布下R1与R2区的分布情况,该图分别画出p(x|ω1)P(ω1)及p(x|ω2)P(ω2)的分布情况,由于P(e)也可以(2-8)式写成
  (2-9)
  因此错误率为图中两个划线部分之和,显而易见只有这种划分才能使对应的错误率区域面积为最小。
  以上讨论的是两类别问题情况,在C类别情况下,很容易写成相应的最小错误率贝叶斯决策规则:
  如果 ,则 (2-10)
  也可将其写成用先验概率与类条件概率密度相联系的形式,得:
  如果
   (2-11)
  至于计算多类别决策过程中的错误率,需把特征空间分割成R1,R2,…,Rc个区域,在每个区域Ri统计将所有其它类错误划为该区域对应的i类的概率,则每个区域共有c-1项错误率,总共有c(c-1)计算项,计算是很繁琐的。为此,可以改成计算平均正确分类概率P(c)即
  (2-12)
  由于上式中只有c项,计算要简单得多。然后通过式子P(e)=1-P(c),就可计算出平均错误率。

   下面是一个程序示例:

  现有一组待识别的细胞样本,其先验概率为0.8(正常)和0.2(异常);其观察值相应的类条件概率密度存放在文件file1.txt中,试利用最小错误率贝叶斯决策规则,设计一个分类器,对它们进行分类(分为两类,正常和异常),并将结果输出到一个新文件file2.txt

注:在文件file1.txt中存放了正常状态下(第一行)和异常状态下(第二行)细胞特征观察值的类条件概率密度。

 

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ifstream datatxt;
    ofstream result;
    datatxt.open("file1.txt", ios::in);
    double* data = new double[40];
    int i = 0;
    while (datatxt){
        datatxt >> data[i];
        i++;
    }
    datatxt.close();
    result.open("file2.txt");
    result << "正常概率\t异常概率\t判断结果\n";

    double sum = 0, pro1 = 0, pro2 = 0, priorpro1=0.8,priorpro2=0.2;
    for (int j = 0; j < 20; j++){
        sum = priorpro1*data[j] + priorpro2*data[j + 20];
        pro1 = priorpro1*data[j] / sum;
        pro2 = priorpro2*data[j+20] / sum;
        result << pro1 << "\t";
        result << pro2<<"\t";
        if (pro1 > pro2){
            result << "正常\n";
        }
        else{
            result << "异常\n";
        }
    }
    result.flush();
    result.close();
    return 0;
}

 

附:

file1.txt:

0.03 0.15 0.07 0.16 0.05 0.06 0.19 0.19 0.09 0.14 0.04 0.03 0.17 0.04 0.06 0.18 0.10 0.16 0.06 0.18
0.17 0.05 0.13 0.04 0.15 0.14 0.01 0.01 0.11 0.06 0.16 0.17 0.03 0.16 0.14 0.02 0.10 0.04 0.14 0.02

file2.txt

正常概率 异常概率 判断结果
0.413793 0.586207 异常
0.923077 0.0769231 正常
0.682927 0.317073 正常
0.941176 0.0588235 正常
0.571429 0.428571 正常
0.631579 0.368421 正常
0.987013 0.012987 正常
0.987013 0.012987 正常
0.765957 0.234043 正常
0.903226 0.0967742 正常
0.5 0.5 异常
0.413793 0.586207 异常
0.957746 0.0422535 正常
0.5 0.5 异常
0.631579 0.368421 正常
0.972973 0.027027 正常
0.8 0.2 正常
0.941176 0.0588235 正常
0.631579 0.368421 正常
0.972973 0.027027 正常

posted @ 2014-11-09 12:11  海上的风  阅读(11813)  评论(1编辑  收藏  举报