实验二 势函数算法的迭代训练预习报告
时间:2022-10-12 07:30:01
1.基本思想
空间会形成一个“高地”,这些样本点所处的位置就是“山头”。同样,用电位的几何分布来看待它ω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)。
2.实验内容
假设正常(类)和非正常(类)对患者三项主要指标进行检查的数据如下:
类1:(1,2,5), (1,1, (3,3,6);
类2: (5、6、10),(7、6、11).
3.实验步骤
①选定势函数;
②确定适当的数据结构,以完成势函数和判断函数的正确表示;
③训练学习训练样本,建立判别函数,满足分类要求
④记录并输出训练轮;
⑤用你的分类器判断所有样本的类别,比较实际类别的差异;
⑥判断分类样本,得到其类别,如可能,用几何分布来解释;
⑦输出判别函数的表达形式。
4.代码
#include?
#include?
#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
?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
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<<"-"< }
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<<"-"< }
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<<"-"< }
else?if(s[ftbl[i].index].x[2]<0){
cout<<" "<<-s[ftbl[i].index].x[2]<<")^2]}";
}else{
cout<<")^2]}";
}
cout<
5.测试
(1)先测试现有样本的正确性。
(2)用待分类数据进行分类。 (二、三、五)
分别测试,检查它们的几何分布是否与分类和分类的结果一致,以确认设计的分类器是正确的。
测试代码:
cout<<"判断每个样本的类别:"<
for(i=0;i<=r;i )?{?
temp=0;?
for(j=0;j
?g =ftbl[i].symbol*exp(-temp);?
}?
if?(g>0){
cout<<"第"<
cout<<"第"<
cout<<"第"<
?cout<
int a[]={2,3,5};
g=0;
for(i=0;i<=r;i++){
temp=0;
for(j=0;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)的类别为"< }
//再判断(6,7,10)的类别
int b[]={6,7,10} ;
g=0;
for(i=0;i<=r;i++){
temp=0;
for(j=0;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)的类别为"< }
}