以下两个均为感知机对于3个样本数据(3,3,1),(4,3,1),(1,1,-1)的分类实现。
这是感知机普通形式的实现
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int x1,x2,y;
node(int x1=0,int x2=0,int y=0)
:x1(x1),x2(x2),y(y)
{
}
};
class A{
};
int sign(int x)
{
if(x>0)
return 1;
else if(x<0)
return -1;
else if(x==0)
return 0;
}
int main()
{
node nn[3];
nn[0]=node(3,3,1);
nn[1]=node(4,3,1);
nn[2]=node(1,1,-1);
int w1=0,w2=0,b=0;
int cnt=0;
while(true)
{
//cout<<cnt<<" cnt"<<endl;
cnt++;
bool jump=false;
for(int i=0;i<3;i++)
{
int x1=nn[i].x1;
int x2=nn[i].x2;
int y=nn[i].y;
if(sign(w1*x1+w2*x2+b)!=y)
{
w1=w1+y*x1;
w2=w2+y*x2;
b=b+y;
cout<<w1<<" "<<w2<<" "<<b<<" "<<cnt<<" "<<x1<<" "<<x2<<" "<<y<<endl;
jump=true;
}
if(jump)
break;
}
if(jump==false)
break;
}
cout<<w1<<" "<<w2<<" "<<b<<endl;
}
以下是感知机对偶形式的分类实现
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int gram[3][3];
struct node
{
int x1,x2,y,a;
node(int x1=0,int x2=0,int y=0,int a=0)
:x1(x1),x2(x2),y(y),a(a)
{
}
};
node nn[3];
int sign(int x)
{
if(x>0)
return 1;
else if(x<0)
return -1;
else if(x==0)
return 0;
}
void calgram()
{
memset(gram,0,sizeof(gram));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
int x11=nn[i].x1;
int x12=nn[i].x2;
int x21=nn[j].x1;
int x22=nn[j].x2;
gram[i][j]+=(x11*x21+x12*x22);
}
}
int main()
{
//node nn[3];
nn[0]=node(3,3,1,0);
nn[1]=node(4,3,1,0);
nn[2]=node(1,1,-1,0);
calgram();
int b=0;
int cnt=0;
while(true)
{
cnt++;
if(cnt==10)
break;
bool jump=false;
for(int i=0;i<3;i++)
{
int yi=nn[i].y;
int res=0;
for(int j=0;j<3;j++)
{
int aj=nn[j].a;
int yj=nn[j].y;
res+=gram[i][j]*aj*yj;
}
res+=b;
if(sign(res)*yi<=0)
{
//cout<<sign(res)<<" "<<yi<<" "<<i<<endl;
nn[i].a+=1;//学习率为1
b+=yi;
jump=true;
//cout<<"*****"<<endl;
break;
}
}
// for(int i=0;i<3;i++)
// cout<<nn[i].a<<" ";
// cout<<b<<endl;
if(jump==false)
{
break;
}
}
int w1=0,w2=0;
for(int i=0;i<3;i++)
{
int x1=nn[i].x1;
int x2=nn[i].x2;
int y=nn[i].y;
int a=nn[i].a;
w1+=x1*a*y;
w2+=x2*a*y;
}
cout<<w1<<" "<<w2<<" "<<b<<endl;
}