KNN入门练习

Knn算法简略入门

作为一名弱弱的大一新生,看了一个下午的IEEE论文,勉强看懂了论文的一丝皮毛,然而我并不会用矩阵处理,直接模拟矩阵处理时间复杂度过高且繁琐(MATLAB真的很重要),只好拿着思路直接模拟啦
(p.s.学好英语和线代真的很重要Orz)
贴几张论文的图这里写图片描述

这里写图片描述

基本步骤:

1.读入数据集
2.K值处理
    选出训练集D'(选用留出法处理数据集)
    用训练集进行训练k从2~sqrt(n)
    对训练集中的所有元素进行k临近判断,比较正确率
    求精度比较得到一个k
3.测试模型
    用测试集测试比较正确率是否符合预期否则从新执行step2

这里写图片描述

代码展示

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#define FOR(i,j,k) for(i=j;i<+k;++i)
#define mal 0x7fffffff
#define R(x) (rand() % x)
using namespace std;
struct ma{
    int x,y,t,d;
    int c;
}; 
ma a[10000];
ma b[10000];
ma c[10000];
int n,m,u;
int sqr(int x)
{
    return x*x;
}
void ca(int x,int y,ma a)
{
    a.d=abs(x-a.x)+abs(y-a.y);
}
void init()
{
    freopen("1.txt","r",stdin);
    scanf("%d",&n);
    int i;
    m=n*0.8;
    FOR(i,1,n)
       {
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
            a[i].t=0;
       }
}
void clset()
{
    int dis;
    int i,j,k;
    i=0;
    while(i<m)
        {
            dis=R(n)+1;
            if (!a[dis].t)
                {
                    a[dis].t++;
                    i++;
                }
        }
    j=0;
    k=0;
    FOR(i,1,n)  
    {
        if (a[i].t) b[j++]=a[i];    
        else c[k++]=a[i];
    }
    u=k;
} 
int comp(ma x,ma y)
{
    return x.d<y.d;
}
double acr[10000]={0};
int chk()
{
    int i,j,k;
    int ans1;
    int ans2;
    int ar;
    int lsar=-mal;
    int ans;
    int cj[10000];
    FOR(k,2,sqrt(n))
    {
        ar=0;
        FOR(i,1,m)
            {
                FOR(j,1,m)
                {
                    ca(b[j].x,b[j].y,b[i]);
                }
                sort(b+1,b+1+n,comp);
                memset(cj,0,sizeof(c));
                ans1=-mal;
                FOR(j,1,k)
                {
                    cj[b[j].c]++;
                    if (ans1<cj[b[j].c]) 
                        {
                            ans1=cj[b[j].c];
                            ans2=b[j].c;
                        }
                }//zhao dao k ling jin
                if (ans2==b[i].c) ar++;
             }
        if (ar>lsar) {
                        lsar=ar;
                        ans=k;
                     }
        }
    return ans;
}
int test(int k)
{
    int i,j,l;
    double ar=0;
    int ans1,ans2;
    int cj[10000];
    FOR(i,1,u)
    {
        FOR(j,1,m)
            {
                ca(c[j].x,c[j].y,b[i]);
            }
        sort(b+1,b+1+n,comp);
        ans1=0;
        FOR(j,1,k)
            {
                cj[b[j].c]++;
                    if (ans1<cj[b[j].c]) 
                        {
                            ans1=cj[b[j].c];
                            ans2=b[j].c;
                        }
                } 

            if  (ans2==c[i].c) ar++;
   }
   ar=ar/(double)u;
   if (ar>0.8) return 1;else return 0;
}
int done(int x,int y,int k)
{
    int i,j,l;
    int ans1,ans2;
    int cj[100000];
    FOR(j,1,n)
            {
                ca(x,y,a[j]);
            }
        sort(a+1,a+1+n,comp);
        ans1=0;
        FOR(j,1,k)
            {
                cj[a[j].c]++;
                    if (ans1<cj[a[j].c]) 
                        {
                            ans1=cj[a[j].c];
                            ans2=a[j].c;
                        }
            }
    return ans2;         
}
int main()
{
    init();
    int k,x,y;
    do
    {
        clset();
        k=chk();
    }while(test(k));
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        printf("%d",done(x,y,k));
    }
    return 0;
}









昂,入门新生,如有错误恳请不吝赐教!

参考资料

Discriminant Adaptive Nearest Neighbor Classification

Trevor Hastie and Rolbert Tibshirani

IEEE TRANSACTIONS ON PAITERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 18, NO. 6, JUNE 1996

《机器学习》周志华

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值