蜜汁KNN
基本步骤
在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
实现代码
离散化处理输出版
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#define MAX 1000007
#define MAXN 1003
#define FOR(i,j,k) for(i=j;i<=k;++i)
using namespace std;
struct sss{
int x,y;
double d;
char c;
};
sss p[MAXN];
int n,px,py;
int comp(sss x,sss y)
{
return x.d<y.d;
}
int sqr(int x)
{
return x*x;
}
int main()
{
freopen("1.txt","r",stdin);
char ccc;
scanf("%d%d%d",&n,&px,&py);
int i,j,k,l;
FOR(i,1,n)
{
scanf("%d%d%c%c",&p[i].x,&p[i].y,&ccc,&p[i].c);
p[i].d=sqrt(sqr(p[i].x-px)+sqr(p[i].y-py));
}
sort(p+1,p+1+n,comp);
int b[255];
int hs[255];
int t=0;
k=sqrt(n);
FOR(i,1,k)
{
if (!b[p[i].c]) {
t++;
hs[t]=p[i].c;
}
b[p[i].c]++;
}
int s=0;
char ans;
FOR(i,1,t)
if (b[hs[i]]>s)
{
ans=hs[i];
s=b[hs[i]];
}
printf("%c",ans);
return 0;
}
非离散化改进版
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#define MAX 1000007
#define MAXN 1003
#define FOR(i,j,k) for(i=j;i<=k;++i)
using namespace std;
struct sss{
int x,y;
double d;
char c;
};
sss p[MAXN];
int n,px,py;
int comp(sss x,sss y)
{
return x.d<y.d;
}
int sqr(int x)
{
return x*x;
}
int main()
{
freopen("1.txt","r",stdin);
char ccc;
scanf("%d%d%d",&n,&px,&py);
int i,j,k,l;
FOR(i,1,n)
{
cin>>p[i].x>>p[i].y>>p[i].c;
p[i].d=sqrt(sqr(p[i].x-px)+sqr(p[i].y-py));
}
sort(p+1,p+1+n,comp);
int b[255]={0};
int hs[255]={0};
int t=0;
k=sqrt(n);
if (k%2==0) k++;
FOR(i,1,k)
{ b[p[i].c]++;t=max(t,b[p[i].c]);}
FOR(i,1,255)
{ if (b[i]==t) {putchar(i);printf("\n");}}
return 0;
}
测试数据
1.txt:
24 7 4
2 2 r
2 5 r
2 8 r
2 10 r
3 3 b
3 9 r
4 5 r
4 10 r
5 8 r
6 4 b
7 3 b
7 6 r
8 8 b
9 5 b
10 2 b
10 3 b
10 4 b
11 6 b
11 7 b
11 8 r
12 9 r
13 2 b
13 5 b
输出:b答案正确
好啦,继续加油
“`