模式识别课程设计模式识别中基于概率统计的 Bayes 算法分析学号:1102100119班级:自动化111班姓名:许世坚首先对模式识别所用到的理论、研究背景、研究现状及典型应用进行全面的阐述;其次,探讨了如何提取数字字符的特征值,并对各种分类器的设计方法及其优缺点进行了比较;最后采用了以模板库为基础的基于二值数据的Bayes分类实现的识别方法,并以VC++作为编程工具实现了具有友好的图形用户界面的自由手写体数字识别系统。
给出了部分实现算法的代码。
实现了对字体数字的识别。
下面介绍阐述模式识别中用到的Bayes算法理论,研究背景及其典型应用,在典型应用中,探讨提取数字字符bayes算法分类器的设计方法并比较其优缺点,给出其算法的C++实现,利用VC++实现编程工具实现图形界面。
模式识别就是机器识别,计算机识别或者机器自动识别,目的在于让机器自动识别事物,如手写数字的识别,智能交通管理信号的识别,文字识别,语音识别等。
模式识别这个学科的目的就是让机器能做人类能做的事情,具备人类所具有的对各种事物与现象进行分析,描述与判断的部分能力。
模式识别是直观的,无所不在。
人与动物具有模式识别的能力是非常平常的事情,但是对计算机来说实现模式识别是非常困难的。
让机器能够识别,分类需要研究识别的方法。
而模式识别可以概括为两个类型,一个是直接形象的,例如图片,相片,图案,字符图案等;另外的就是无知觉形象而只有数据或信号的波形,如语音,声音,心电图,地震波等。
Bayes决策所讨论的问题:基于最小错误率的Bayes决策指出机器自动识别出现错分类的条件,错分类的可能性如何计算,如何实现使错分类实现可能性最小;基于最小错误风险的Bayes决策,引入了风险与损失概念,希望做到使风险最小,减小危害大的错分类情况。
错分类造成损失不一样,不同的错误分类造成的损失也是不一样的,不同的错误分类造成的损失会不相同,后一种错误更加可怕,因此就考虑减小因错误分类造成的危害损失。
2.Bayes算法若已知总共有M类物体,以及各类在这d维特征空间的统计分布,具体说来就是已知各类别wi=1,2,…M的先验概率P(wi)及类条件概率密度函数P(X|wi)。
对于待测样品,Bayes公式可以计算出该样品分属于各类别的概率,叫做后验概率,看X属于哪个类的可能性最大,就把X归于可能性最大的那个类,后验概率作为识别对象归属的依据。
Bayes公式如下:识别的状态就是一个随机变量,而某种状态出现概率是可以估计的。
Bayes公式体现了先验概率,类概率密度函数,后验概率三者之间的关系。
2.1先验概率P (wi )先验概率P (wi )针对M 个事件出现的可能性而言,不考虑其他条件。
例如由统计资料表明总药品数为n ,其中正常药品数为n1,异常药品数为n2,则1(1)n P w n = 2(2)n P w n =称P (w1)和P(w2)为先验概率。
显然在一般情况下正常药品所占比例比较大,即P (w1)>P(w2),仅按照先验概率来决策,就会把所有药品都划归为正常药品,并没有达到将正常药品与异常药品区分开的目的。
这表明先验概率所提供的信息太少。
2.2类条件概率密度函数P (X/wi )是指在已知某类别的特征空间中,出现特征值X 的概率密度,即第wi 类样品它的属性X 是如何分布的。
在工程上很多的问题中,统计数据往往满足正态分布规律。
正态分布简单,分析方便,参量少,是一种适宜的数学模型。
如果采用正态密度函数是作为类条件概率密度的函数形式,则函数内的参数如期望方差是未知的,那么问题就变成了如何利用大量样品对这些参数进行估计,只要估计出这些参数,类条件概率密度函数P (X|wi )也就可以确定了。
单变量正态分布概率密度函数为:其中:u为数学期望(均值);为方差。
多维正态密度函数为:其中:S为N维协方差矩阵;S^-1为S的逆矩阵 =(u1,u2,…,un)为N维均值向量;X=(x1,x2,…,xN)为N维特征向量在大多数情况下,类条件概率密度函数是可以采用多维变量的正太概率密度函数来模拟,即:2.3后验概率后验概率是指呈现状态X时,该样品分属各类别的概率,这个概率值可以作为识别对象归属的依据。
由于属于不同类的待识别对象存在着呈现相同的观察值的可能,即所观察到的某一样品的特征向量为X,而在类中有不止一类可能呈现这一值,它属于各类的概率可用P (wi|X)表示。
可以利用Bayes公式来计算这条件概率,称之为状态的后验概率:P(wi|X)是表示在X出现条件下,样品为wi类的概率。
2.4 P(w1|X)和P (w2|X )与P(X|w1)和P (X|w2)的区别 P(w1|X)和P (w2|X )是在同一条件下,比较w1与w2出现的概率,如P(w1|X)>P (w2|X ),则可能的以下结论,在X 条件下,事件w1出现的可能性比事件w2出现的可能性大。
P(w1|X)与P (w2|X )都是指各自条件下出现X 的可能性,两者之间没有联系,比较两者没有意义。
P(w1|X)与P (w2|X )是在不同条件下讨论问题,不能因为P(w1|X)>P (w2|X ),就认为X 是第一类事物的可能性较大。
3算法的实现3.1基于最小错误率Bayes 分类实现数字样品的识别实现: 在手写的数字识别中属于多类情况,每类样品呈正态分布。
(1)求出每一类手写数字样品的均值11(1,2,...,),0,1,2,...,9NiT j xi xij xi xi xin i Ni ====∑Ni 代表wi 类的样品个数,n 代表特征数目。
(2)求每一类的协方差矩阵11()(),,1,2,...,1Ni il sjk xlj xj xlk xk j k n Ni ==--=-∑L 代表样品在wi 类中的序号,其中l=0,1,2,…,Ni 。
Xlj 代表wi 类的第L 个样品,第J 个特征值。
xj 代表wi 类的Ni 个样品第j 个特征的平均值。
Xlk 代表wi 类的第l 个样品,第K 个特征值。
xk 代表wi 类的Ni 个样品第K 个特征的平均值。
Wi 类的协方差矩阵为:(3)计算出每一类的协方差矩阵的逆矩阵Si^-1以及协方差矩阵的行列式|Si|。
(4)求出每一类的先验概率:()/,0,1,2,...,9P wi Ni N i ≈=其中P(wi)为类别为数字i 的先验概率,Ni 为数字i 的样品数,N 为样品总数。
(5)将各个数带入判别函数111()())()ln ()ln ||22T hi X X Xi Si X Xi P wi Si -=---+-(6)判别函数最大值所对应就是手写数字的类别。
3.2基于最小风险的Bayes 分类实现 (1)求出每一类手写数字样品的均值。
11(1,2,...,),0,1,2,...,9NiT j Xi Xij xi xi xin i Ni ====∑Nj 代表wi 类的样品个数,n 代表特征数目。
(2)求每一类的协方差矩阵。
11()(),,1,2,...,1Ni ilj lk k l sjk X xj x x j k n Ni ==--=-∑Wi 类的协方差矩阵为(3)计算出每一类协方差矩阵的逆矩阵1i S -以及协方差矩阵行列式||i S .(4)求出每一类的先验概率(),0,1,2,...,9i NiP w i N ≈=其中P (wi )为类别为数字i 的先验概率,Ni 为数字i 的样品数,N 为样品总数。
(5)定义损失数组为loss[10][10].设初值为0,[][]1,i jloss i j i j =⎧=⎨≠⎩(6)计算每一类损失risk[i]:90[][][][]j risk i loss i j P j ==∑(7)找出最小损失所对应的类,该类即是待测样品所属的类别。
附录:/最小错误率Bayes分离器算法实现int Classfication::BayesLeastError(){double X[25];//待测样品double Xmeans[25];//样品的均值double S[25][25];//协方差矩阵double S_[25][25];//S的逆矩阵double Pw;//先验概率、double hx[10];//判别函数int i,j,k,n;for(n=0;n<10;n++)//循环类别~9{int num=patern[n].number;//样品的个数/***************************Functions:求样品的平均值****************************/for(i=0;i<25;i++)Xmeans[i]=0.0;for(k=0;k<num;k++){for(i=0;i<25:i++)Xmeans[i]+=patern[n].feature[k][i]>0.1?1.0:0.0; }for(i=0;i<25:i++)Xmeans[i]/=(double)num;/***************************Functions:求协方差矩阵****************************/double mode[200][25];for(i=0;i<num;i++)for(j=0;j<25;j++)mode[i][j]=patern[n].feature[i][j]>0.1?1.04:0.0;for(i=0;i<25;i++)for(j=0;j<25;j++){double s=0.0;for(k=0;k<num;k++)s=s+(mode[k][i]-Xmeans[i]*(mode[k][j]-Xmeans[j]); s=s/(double)(num-1);S[i][j]=s;}/***************************Functions:求先验概率****************************/int total=0;for(i=0;i<10;i++)total+=patern[i].number;Pw=(double)num/(double)total;/************************Functions:求S的逆矩阵************************/ //for(i=0;i<25;i++)for(j=0;j<25;j++)S_[i][j]=S[i][j];double(*p)[25]=S_;brinv(*p,25);/********************** **Functions:求S的行列式************************/ double (*pp)[25]=S;double DetS;DetS=bsdet(*pp,25);/************************Functions:求判别函数************************/for(i=0;i<25;i++)X[i]=testsample[i]>0.1?1.0:0.0;for(i=0;i<25;i++)X[i]-=Xmeans[i];double t[25];for(i=0;i<25;i++)t[i]=0;brmul(X,S_,25,t);double t1=brmul(t,X,25);//矩阵A与矩阵B的乘积矩阵C=AB double t2=log(Pw);double t3=log(DetS+1);hx[n]=-t1/2+t2-t3/2;}/************************Functions:判别函数的最大值************************/ double maxval=hx[0];int number=0;for(n=1;n<10;n++){if(hx[n]>maxval){maxval=hx[n];number=n;}}return number;}。