knn算法的部分处理操作

来源:互联网 发布:影响因素分析模型知乎 编辑:程序博客网 时间:2024/06/15 02:53

蜜汁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答案正确

好啦,继续加油

“`