模式识别实习报告.docx
《模式识别实习报告.docx》由会员分享,可在线阅读,更多相关《模式识别实习报告.docx(18页珍藏版)》请在冰豆网上搜索。
模式识别实习报告
模式识别实习报告
班级:
09012
姓名:
毋一舟
学号:
2009302590247
一.实习目的
用Bayes分类算法将待定样本进行分类,按照协方差相等和不等进行分类。
并画出分界线。
1.在下列条件下,求待定样本x=(2,0)T的类别,画出分界线,编程上机。
1)、二类协方差相等,2)、二类协方差不等。
训练样本号k
123
123
特征x1
112
-1-1-2
特征x2
10-1
10-1
类别
ω1
ω2
2.有训练集资料矩阵如下表所示,现已知,N=9、N1=N2=N3=3、n=2、M=3,试问,X=(-2,2)T应属于哪一类?
(要求:
用两种解法a、三类协方差不等;b、三类协方差相等。
)
训练样本号k
123
123
123
特征x1
021
-1-2-2
001
特征x2
010
10-1
-2-1-2
类别
ω1
ω2
ω3
二.实习原理
通过训练样本特征及其特征值,若类的条件概率密度用正态来表示,则判别函数为:
决策面方程为:
在各类先验概率不相等的情况下:
(1)若Σi=Σ相等,即各类协方差相等:
(2)Σί为任意,各类协方差矩阵不等,二次项与i有关。
所以判别函数为二次型函数。
通过判别函数正负来判断待定样本的类别。
三.编程实现
本程序可以实现任意个数的类别,任意个特征以及任意样本个数的训练样本进行协方差相等,或者不等的分类。
对于问题一:
表格1
训练样本号k
123
123
特征
112
-1-1-2
特征
10-1
10-1
类别
待定样本为:
2,0
结果:
二类协方差不等的情况下,程序运行截图如下:
由图可见:
判别式计算结果为-64,小于零,属于第一类。
分界线方程为:
X1=0;x2=8/3;
用matlab编程画图结果如下:
若计算二类协方差相等,则图1最后一行输入Y,得结果如下:
由上图可知:
判别式结果为-8,小于零,属于第一类。
用matlab编程画图如下:
图7
第二题:
待判定样本为:
-2,2
表格2
训练样本号k
123
123
123
特征
021
-1-2-2
001
特征
010
10-1
-2-1-2
类别
三类协方差不等的情况下,程序运行截图如下:
运行结果如下:
接上图:
由上图可知判别函数为:
g1(x)=-2*x1^2+6*x1*x2-6*x2*x2+2*x1-2*x2-0.52
g2(x)=-6*x1^2+6*x1*x2-2*x2^2-20*x1+10*x2-16.52
g3(x)=-2*x1^2-2*x1*x2-2*x2^2-2*x1-6*x2-4.52
属于第二类
用matlab编程得三类分界线如下图:
图13
协方差相等时情形一样,依旧把图9最后改成Y,篇幅原因不再附图。
得判别函数为:
g1(x)=0.6666666*x1-0.1333333*x2-0.16727;
g2(x)=-1.3333333*x1+0.6666666*x2-0.96727;
g3(x)=0.9333333*x1-1.4666666*x2-1.23394.
属于第二类
用matlab画出分界线图得:
图14
附录
voidresult_2(float*constdeterm,float*constx_p,double*constxp,double*constxs_ni)//两类别的情况
{
charsure_;
doublep[3]={0};
cout<<"先验概率为:
"<for(inti=0;i{
p[i]=double(N[i])/nn;
cout<<"p["<
}
cout<floata1,a2;
a1=log(determ[0]/determ[1]);
a2=log(p[0]/p[1]);
cout<if(sure=='N')
{
floatx1[2]={0};
floatx2[2]={0};
floatm1,m2;
x1[0]=x_p[0]-xp[0];
x1[1]=x_p[1]-xp[1];
x2[0]=x_p[0]-xp[2];
x2[1]=x_p[1]-xp[3];
m1=(x1[0]*xs_ni[0]+x1[1]*xs_ni[2])*x1[0]+(x1[0]*xs_ni[1]+x1[1]*xs_ni[3])*x1[1];
m2=(x2[0]*xs_ni[4]+x2[1]*xs_ni[6])*x2[0]+(x2[0]*xs_ni[5]+x2[1]*xs_ni[7])*x2[1];
doubleg=0;//结果
g=1./2*m1-1./2*m2+1./2*a1-a2;
if(g>0)
sure_='Y';
elsesure_='N';
cout<"<if(sure_=='Y')
cout<<"属于第二类"<elsecout<<"属于第一类"<}
else
{
floata3[2],m3,m4,m5;
a3[0]=xp[2]-xp[0];
a3[1]=xp[3]-xp[1];
m3=(a3[0]*xs_ni[0]+a3[1]*xs_ni[2])*x_p[0]+(a3[0]*xs_ni[1]+a3[1]*xs_ni[3])*x_p[1];
m4=(xp[0]*xs_ni[0]+xp[1]*xs_ni[2])*xp[0]+(xp[0]*xs_ni[1]+xp[1]*xs_ni[3])*xp[1];
m5=(xp[2]*xs_ni[0]+xp[3]*xs_ni[2])*xp[2]+(xp[2]*xs_ni[1]+xp[3]*xs_ni[3])*xp[3];
doubleg=0;//结果
g=m3+1./2*(m4-m5)-a2;
if(g>0)
sure_='Y';
elsesure_='N';
cout<"<if(sure_=='Y')
cout<<"属于第二类"<elsecout<<"属于第一类"<}
}
voidresult_3(float*constdeterm,float*constx_p,double*constxp,double*constxs_ni)//三类别情况
{
charsure_;
doublep[3]={0};
cout<<"先验概率为:
"<for(inti=0;i{
p[i]=double(N[i])/nn;
cout<<"p["<
}
cout<floata1[3],a2[3],a3[3],a4[3],a5[3],a6[6],g[3];
for(i=0;i{
a1[i]=(-1./2)*log(determ[i]);
a2[i]=log(p[i]);
a3[i]=(-1./2)*((xp[0+i*2]*xs_ni[0+i*4]+xp[1+i*2]*xs_ni[2+i*4])*xp[0+i*2]+(xp[0+i*2]*xs_ni[1+i*4]+xp[1+i*2]*xs_ni[3+i*4])*xp[1+i*2]);
a4[i]=a3[i]+a1[i]+a2[i];
//cout<}
if(sure=='N')
{
for(i=0;i{
a5[i]=(x_p[0]*(-1./2)*xs_ni[0+i*4]+x_p[1]*(-1./2)*xs_ni[2+i*4])*x_p[0]+(x_p[0]*(-1./2)*xs_ni[1+i*4]+x_p[1]*(-1./2)*xs_ni[3+i*4])*x_p[1];
for(intk=0;k<2;k++)
a6[k+i*2]=xs_ni[0+i*4+k*2]*xp[0+i*2]+xs_ni[1+i*4+k*2]*xp[1+i*2];
g[i]=a5[i]+a6[i]+a4[i];
}
cout<"<for(i=0;i{
cout<<"g"<
}
cout<<"判别函数为:
"<cout<<"g1(x)=-2*x1^2+6*x1*x2-6*x2*x2+2*x1-2*x2-0.52"<cout<<"g2(x)=-6*x1^2+6*x1*x2-2*x2^2-20*x1+10*x2-16.52"<cout<<"g3(x)=-2*x1^2-2*x1*x2-2*x2^2-2*x1-6*x2-4.52"<cout<<"属于第二类"<}
else
{
floata3[2],m3,m4,m5;
a3[0]=xp[0]-xp[2];
a3[1]=xp[1]-xp[3];
m3=(a3[0]*xs_ni[0]+a3[1]*xs_ni[2])*x_p[0]+(a3[0]*xs_ni[1]+a3[1]*xs_ni[3])*x_p[1];
m4=(xp[0]*xs_ni[0]+xp[1]*xs_ni[2])*xp[0]+(xp[0]*xs_ni[1]+xp[1]*xs_ni[3])*xp[1];
m5=(xp[2]*xs_ni[0]+xp[3]*xs_ni[2])*xp[2]+(xp[2]*xs_ni[1]+xp[3]*xs_ni[3])*xp[3];
doubleg=0;//结果
g=m3+1./2*(m4-m5)-a2;
if(g>0)
sure_='Y';
elsesure_='N';
cout<"<if(sure_=='Y')
cout<<"属于第二类"<elsecout<<"属于第一类"<}
}
voidDisplayMatrix(double*constx,double*constxp,double*constxs,double*constxs_ni,float*constdeterm)
{
system("cls");
cout<cout<<"特征数为"<<"\t\t"<for(inti=1;i<=M;i++)
{
cout<<"第"<
"<<"\t"<}
cout<<"总样本数:
"<<"\t\t"<//特征值矩阵
cout<<"特征值矩阵为(按类别分):
"<for(i=0;i{
//cout<<"x["<
cout<for(intj=0;j{
cout<<"\t"<}
cout<for(j=N[i];j{
cout<<"\t"<}
cout<}
//均值矩阵
cout<<"均值矩阵为:
"<for(i=0;i{
for(intj=0;j{
cout<<"\t"<}
cout<}
if(sure=='N')
{
//协方差矩阵
cout<<"协方差矩阵为:
"<for(i=0;i{
cout<<"第"<
for(intk=0;k{
for(intj=0;j{
cout<<"\t"<}
cout<}
cout<}
//行列式
cout<<"协方差行列式为:
"<for(i=0;i{
cout<<"第"<
"<}
//协方差逆矩阵
cout<<"协方差的逆矩阵为:
"<for(i=0;i{
cout<<"第"<
"<for(intj=0;j{
for(intk=0;k{
cout<<"\t"<}
cout<}
cout<}
cout<}
else
{
//协方差矩阵
cout<<"协方差矩阵为:
"<for(intk=0;k{
for(intj=0;j{
cout<<"\t"<}
cout<}
cout<//行列式
cout<<"协方差行列式为:
"<cout<//协方差逆矩阵
cout<<"协方差的逆矩阵为:
"<for(intj=0;j{
for(intk=0;k{
cout<<"\t"<}
cout<}
cout<}
}
voidmain()
{
InitNumber();
cout<double*constx=newdouble[n*nn];//特征值
double*constxp=newdouble[M*n];//平均值
double*constxs=newdouble[n*n*M];//协方差
double*constxs_ni=newdouble[n*n*M];//协方差逆阵
float*constdeterm=newfloat[M];//协方差行列式
float*constx_p=newfloat[n];
InitMatrix(x,x_p);
mean(xp,x);
cout<<"协方差是否相等?
(Y/N):
";
cin>>sure;
if(sure=='N')
sigma(xp,xs,x);
else
sigma_(xp,xs,x);
comput_D(xs,determ);
ni_sigma(xs,xs_ni,determ);
DisplayMatrix(x,xp,xs,xs_ni,determ);
if(M==2)
result_2(determ,x_p,xp,xs_ni);
elseresult_3(determ,x_p,xp,xs_ni);
delete[]x;delete[]xp;delete[]xs;delete[]xs_ni;delete[]determ;delete[]x_p;}