空间会形成一个“高地”,这些样本点所处的位置就是“山头”。同样,用电位的几何分布来看待它ω2模式样本在其附近空间形成凹地。在两种电位分布之间选择合适的等高线,可视为模式分类的判别函数。模式分类的判别函数可以通过分布在模式空间中的许多样本向量{xk, k=1,2,…且 }产生的势函数。 任何样本产生的势函数K(x, xk)表征,判断函数d(x)势函数序列可由势函数序列K(x, x1), K(x, x2),…在训练过程中,序列中的这些训练过程中输入机器的训练模式样本x1,x2,…。在训练状态下,模式样本逐个输入分类器,分类器连续计算相应的潜力函数,第k步迭代中的积累位置决定了步前所有单个潜力函数的积累。以K(x)如果添加的训练样本表示位置函数的积累xk 1.如果分类错误,则需要修改积累函数。如果分类正确,则不变。从势函数中可以看出,积累位势起着判断函数的作用xk 1属于ω1时,Kk(xk 1)>0;当xk 1属于ω2时,Kk(xk 1)<0.积累位势可作为判断函数,无需任何修改。由于模式样本的错误分类会导致训练中积累位置的变化,因此提供了确定势函数算法ω1和ω二、二别函数的迭代过程。判别函数表达式:取d(x)=K(x),则有:dk 1(x)= dk(x) rk 1K(x, xk 1)。
假设正常(类)和非正常(类)对患者三项主要指标进行检查的数据如下: 类1:(1,2,5), (1,1, (3,3,6); 类2: (5、6、10),(7、6、11).
①选定势函数; ②确定适当的数据结构,以完成势函数和判断函数的正确表示; ③训练学习训练样本,建立判别函数,满足分类要求 ④记录并输出训练轮; ⑤用你的分类器判断所有样本的类别,比较实际类别的差异; ⑥判断分类样本,得到其类别,如可能,用几何分布来解释; ⑦输出判别函数的表达形式。
#include?<iostream>? #include?<math.h>? #define?n?6 #define?m?30? #define?d?3?? struct?sample?{?? int?x[d];? int?cl;? }; ?struct?func{? ?int?symbol;?? int?index; ?};? struct?func?ftbl[m];? int?k,r=-1,tag=1,i,j; float?g=0,temp; struct?sample?s[n]={? {1,2,5,1}, ?{3,3,6,1} {5,6,10,2}, {7,6,11,2}, {8,7,12,2} };? int?main()?{ while(tag==1){? tag=0;??? for?(k=0;k<n;k ){? if?(r==-1){ ?r ; ?ftbl[r].symbol=1;? ftbl[r].index=0;? continue;? }else{ g=0; for(i=0;i<=r;i ){ temp=0; for(j=0;j<d;j ) temp =(s[k].x[j]-s[ftbl[i].index].x[j])*(s[k].x[j]-s[ftbl[i].index].x[j]); g =ftbl[i].symbol*exp(-temp); }? if((g>0&&s[k].cl==1)||(g<0&&s[k].cl==2))?{} continue; }else?{ r ; ftbl[r].index=k; tag=1; if(g>0&&s[k].cl==2){ ftbl[r].symbol=-1; } else?if(g<0&&s[k].cl==1){ ftbl[r].symbol=1; } } } } } cout<<"\n\n\n"; for(i=0;i<=r;i ){ if(ftbl[i].symbol==1) if(i==0)? cout<<"exp{-[(x1"; else? cout<<" exp{-[(x1";else cout<<"-exp{-[(x1"; if?(s[ftbl[i].index].x[0]>0){ ?cout<<"-"<<s[ftbl[i].index].x[0]<<")^2 (x2"; } else?if(s[ftbl[i].index].x[0]<0){ cout<<" "<<-s[ftbl[i].index].x[0]<<")^2 (x2"; }else{ cout<<")^2 (x2"; } if?(s[ftbl[i].index].x[1]>0){ cout<<"-"<<s[ftbl[i].index].x[1]<<")^2 (x3"; } else?if(s[ftbl[i].index].x[1]<0){ cout<<" "<<-s[ftbl[i].index].x[1]<<")^2 (x3"; }else{ cout<<")^2 (x3"; } ?if?(s[ftbl[i].index].x[2]>0){ cout<<"-"<<s[ftbl[i].index].x[2]<<")^2]}"; } else?if(s[ftbl[i].index].x[2]<0){ cout<<" "<<-s[ftbl[i].index].x[2]<<")^2]}"; }else{ cout<<")^2]}"; } cout<<endl; }?
cout<<"判断每个样本的类别:"<<endl;?? for?(k=0;k<n;k )?{? g=0; for(i=0;i<=r;i )?{? temp=0;? for(j=0;j<d;j ) ?temp =(s[k].x[j]-s[ftbl[i].index].x[j])*(s[k].x[j]-s[ftbl[i].index].x[j]);? ?g =ftbl[i].symbol*exp(-temp);? }? if?(g>0){ cout<<"第"<<k<<样本的类别是"<<1<<"\t"; else?if?(g<0){ cout<<"第"<<k<<样本的类别是"<<2<<"\t"; }else{ cout<<"第"<<k<<无法识别样本的类别"<<"\t\t"<< "第"<<k<<样本的实际类别是"<<s[k].cl<<endl; } ?cout<<endl;?//判断(2、3、5),(6、7、10)分别属于类别 ///先判断(2、3、5)的类别 int a[]={2,3,5}; g=0; for(i=0;i<=r;i++){ temp=0; for(j=0;j<d;j++) temp+=(a[j]-s[ftbl[i].index].x[j])*(a[j]-s[ftbl[i].index].x[j]); g+=ftbl[i].symbol*exp(-temp); } if (g>0){ cout<<“样本a=(2,3,5)的类别为"<<1<<"\t\t"; } else if (g<0){ cout<<“个样本a=(2,3,5)的类别为"<<2<<"\t\t"; } else{ cout<<“个样本a=(2,3,5)的类别无法识别"<<"\t\t"<<“个样本a=(2,3,5)的类别为"<<s[k].cl<<endl; } //再判断(6,7,10)的类别 int b[]={6,7,10} ; g=0; for(i=0;i<=r;i++){ temp=0; for(j=0;j<d;j++) temp+=(b[j]-s[ftbl[i].index].x[j])*(b[j]-s[ftbl[i].index].x[j]); g+=ftbl[i].symbol*exp(-temp); } if (g>0){ cout<<“样本b=(6,7,10)的类别为"<<1<<"\t\t"; } else if (g<0){ cout<<“个样本a=b=(6,7,10))的类别为"<<2<<"\t\t"; }else{ cout<<“个样本b=(6,7,10)的类别无法识别"<<"\t\t" <<“个样本b=(6,7,10)的类别为"<<s[k].cl<<endl; } }