1. 程式人生 > 實用技巧 >線性分類器

線性分類器

依舊用的結構體。。。ps.好像是可以給一個輸入進行一次輸出的。

//2020-6-1 線性分類器
//給定一條直線,判斷它是否能將訓練資料中A,B兩類點分開 
#include<iostream>

using namespace std;

struct Point//
{
int x,y;//二維座標 
char type;//所屬類別 
};
Point point[1001];

struct Line//
{
int a0,a1,a2;//a0+a1x+a2y=0
int flag;//1-可以完美分割 0-不可完美分割 
}; 
Line line[21];

int main()
{
    int n,m;//
n個點,m條線 cin>>n>>m; for(int i=0;i<n;i++) { cin>>point[i].x>>point[i].y>>point[i].type; } for(int i=0;i<m;i++) { int lineLoc;//-1線下 1線上 cin>>line[i].a0>>line[i].a1>>line[i].a2; line[i].flag
=1;//初始化 //由第一個點確定線上線下位置與所屬類別的關係 if(line[i].a0+line[i].a1*point[0].x+line[i].a2*point[0].y>0)lineLoc=1; else if(line[i].a0+line[i].a1*point[0].x+line[i].a2*point[0].y<0)lineLoc=-1; for(int j=1;j<n;j++) { if(lineLoc==1) {
if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y>0) { if(point[j].type!=point[0].type) line[i].flag=0; } else if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y<0) { if(point[j].type==point[0].type) line[i].flag=0; } } else if(lineLoc==-1) { if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y<0) { if(point[j].type!=point[0].type) line[i].flag=0; } else if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y>0) { if(point[j].type==point[0].type) line[i].flag=0; } } } if(line[i].flag==1)cout<<"Yes"<<endl; else if(line[i].flag==0)cout<<"No"<<endl; } return 0; }