knn算法的部分处理操作

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

好啦,继续加油

“`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值