zoukankan      html  css  js  c++  java
  • C语言实现knn

     以后写代码一定要谨慎,提高代码的正确率。 

    /***************************************
     * 1.初始化距离为最大值
     * 2.计算未知样本和每个训练样本的距离为dist
     * 3.得到目前k个最邻近样本中的最大距离maxdist
     * 4.如果dist小于maxdist,则将改训练样本作为k-最近邻样本
     * 5.重复2、3、4,直至未知样本和训练样本的距离都算完
     * 6.统计k个最近邻样本中每个类别出现的次数
     * 7.选择出现频率最大的类别作为未知样本的类别
     * *****************************************/
    
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 0x7fffffff
    #define K 3
    
    double  cal_dist(int n,double *x,double *y)
    {
        double sum = 0.0;
        int i =0;
        for(i=0;i<n;i++)
        {
            sum += pow((x[i]-y[i]),2.0);
        }
        return sqrt(sum);
    }
    
    void bubbleSort(double **array,int count,int flag)
    {
        int i = count,j;
        double temp;
        while(i>0)
        {
            for(j=0;j<i-1;j++)
            {
                if(flag == 0)
                {
                    if(array[0][j] > array[0][j+1])
                    {
                        temp = array[0][j];
                        array[0][j] = array[0][j+1];
                        array[0][j+1] = temp;
                        temp = array[1][j];
                        array[1][j] = array[1][j+1];
                        array[1][j+1] = temp;
                    }
    
                }
                else if(flag == 1)
                {
                    if(array[1][j] > array[1][j+1])
                    {
                        temp = array[1][j];
                        array[1][j] = array[1][j+1];
                        array[1][j+1] = temp;
                        temp = array[0][j];
                        array[0][j] = array[0][j+1];
                        array[0][j+1] = temp;
                    }
                }
            }
            i--;
        }
        return;
    }
    int main()
    {
        int n,m;
        FILE *fp;
        fp = fopen("/data.txt","r");
        fscanf(fp,"N=%d,D=%d",&n,&m);
        printf("N=%d,D=%d
    ",n,m);
        double  **array;
        array = (double **)malloc(n*sizeof(double));
        array[0] = (double *)malloc(n*m*sizeof(double));
        int h,j = 0,i =0;
        for(i=1;i<n;i++)
        {
            array[i] = array[i-1] + m;                            
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                fscanf(fp,"%lf",&array[i][j]);                                            
            }                                
        }
        double **temp;
        temp = (double **)malloc(2*sizeof(double));
        temp[0] = (double *)malloc(2*K*sizeof(double));
        for(i=1;i<2;i++)
        {
            temp[i] = temp[i-1] + K;
        }
        for(i=0;i<2;i++)
        {
            for(j=0;j<K;j++)
            {
                temp[i][j] = MAX*0.1;
            }
        }
        double *testdata;
        double max_dist = 0.0;
        double distance = 0.0;
        double tmp = 0.0;
        testdata=(double *)malloc((m-1)*sizeof(double));
        printf("input test data containing %d numbers:
    ",m-1);
        for(i=0;i<(m-1);i++)
        {
                fscanf(fp,"%lf",&testdata[i]);
        }
        close(fp);
        while(1)
        {
            for(i=0;i<K;i++)
            {
                if(K > n) break;
                temp[0][i] = cal_dist(n,testdata,array[i]);
                temp[1][i] = array[i][m-1];
            }
            for(i=0;i<K;i++)
            {
                printf("%4lf,%4lf
    ",temp[0][i],temp[1][i]);
            }
            printf("
    ");
            bubbleSort(temp,K,0);
            max_dist = temp[0][K-1];
            for(i=K;i<n;i++)
            {
                distance = cal_dist(n,testdata,array[i]);
                if(max_dist > distance)
                {
                    for(j=0;j<K;j++)
                    {
                        if(distance < temp[0][j])
                        {
                            for(h=K-1;h>j;h--)
                            {
                                temp[0][h] = temp[0][h-1];
                                temp[1][h] = temp[1][h-1];
                            }
                        }
                        temp[0][j] = distance;
                        temp[1][j] = array[i][m-1];
                    }
                }
                max_dist = temp[0][K-1];
            }
            bubbleSort(temp,K,1);
            break;
        }
    
    
        int value_label = 0;
        int count = 0;
        int flag = 0;
        for(i=0;i<K-1;i++)
        {
            if(temp[1][i] != temp[1][i+1])
            {
                if(flag > count)
                {
                    flag = count;
                    value_label = temp[1][i];
                    count =1;
                }
            }
            else
            {
                count ++;
            }
        }
        if(count > flag)
        {
            value_label = temp[1][K-1];
            flag = count;
        }
        printf("Predict message is %d
    ",value_label);
        return 0;
    }
  • 相关阅读:
    redis缓存穿透
    rocketmq配置文件两主两从
    jvm参数模板
    (转)volatile如何保证可见性
    Spring事务传播性与隔离级别
    Redis windows 远程连接配置修改
    Redis安装与配置( Windows10 或Windows server)
    C#中的虚函数及继承关系
    C#高级功能(三)Action、Func,Tuple
    WAMP配置httpd.conf允许外部访问
  • 原文地址:https://www.cnblogs.com/chenyang920/p/7398226.html
Copyright © 2011-2022 走看看