当前位置:   article > 正文

人工智能算法--KNN算法(C++实现)_c++人工智能代码

c++人工智能代码

人工智能

# 上面的图片是在网上随手翻到的-很符合主题-侵权删 #
  • 1

蹭热度ing
Knn算法,用于分类。
通过得到逻辑上的相近程度实现判断,K值的大小体现的是一个容错的过程。
提高预测准确度的方法:
调整K值,找到更好的K值(别太大,也别太小)
数据的预处理(有大佬说过,数据的预处理会比算法本身更重要)
逻辑距离的选择(欧氏距离,闵式距离,切比雪夫距离….)
分类,就是一种选择的过程。将事件抽象为状态点。根据状态点之间的距离,进行度量。(如果不懂我在讲什么,建议把‘动态规划’的算法自己再研究深一点)


下面放上自己用c++做的Knn算法(采用欧氏距离,k值选取为1(并不是一个好的选择,但是我真的很不想自己手工去打那么多的数据集emmmmm)(rand函数可以参数随机数,要是自己没事干了,可以去用那个玩一下))


下面那个算法,还是不那么好的,要是可以的话,可以多选大点的K值,然后再做一个概率的统计。再列一个表。(但C++玩这个确实没意思)
main函数是随手写的一个测试函数,感觉还能凑活着用。
这是用Python写的KNN算法,会方便很多!点击即可看


代码如下:

#include <iostream>
using namespace std;

#include <cmath>
#include <cstring>
char classsify_KNN(int* INX, int **DataSet, int DataSetlen, char *label, int k) // 限定数据规模 
{
    int *b = new int[DataSetlen];
    //设置INX是5列的,DataSet也是 
    for (int i = 0; i < DataSetlen; ++i) {
        double sum = 0;
        for (int j = 0; j < 5; ++j) {
            sum += (DataSet[i][j] - INX[j])* (DataSet[i][j] - INX[j]);
        }
        b[i] = sqrt(sum); 
    }
    //===  接下来用改写选择排序进行减枝,降低时间复杂度 
    for (int time = 0; time < k; ++time){
        int num_index = time;
        for (int j = time + 1; j < DataSetlen; ++j){
            if (b[j] < b[num_index]){
                num_index = j;
            }
        }
        if (time != num_index){
            int tn = b[num_index];
            char tc = label[num_index];
            b[num_index] = b[time];
            label[num_index] = label[time];
            b[time] = tn;
            label[time] = tc;
        }
    } 
    char* sc = new char[k];
    int* sc_num = new int[k];
    memset(sc_num, 0, sizeof(sc_num));
    memset(sc,'0',sizeof(sc));
    int len = 0;
    for (int i = 0; i < k; ++i){
        bool p = true;
        for (int j = 0; j < len; ++j){
            if (sc[j] == label[i]){
                sc_num[j] ++;
                p = false;
            }
        }
        if (p) {
            sc[len] = label[i];
            sc_num[len++] = 1;
        }
    }

    char ans;
    int time = 0;
    for (int i = 0; i < k; ++i) {
        if (time < sc_num[i]){
            ans = sc[i];
            time = sc_num[i];
        }
    }
    cout << "time = "<< time<< endl;
    delete []b;
    delete []sc;
    delete []sc_num;
    return ans;
}

int main(){
    int INX[] = {1,2,3,4,5};
    int **DataSet = new int* [3];
    for (int i = 0;i < 3;++i){
        DataSet[i] = new int[5];
        for (int j = 0; j < 5; ++j){
            DataSet[i][j] = (2 * j + 1 - 3* i) % 9; //这个随便写的一个数据集 
        }
    } 

    char label[] = {'A', 'B', 'C'};
    cout << classsify_KNN(INX, DataSet,3,label, 1)<< endl; 
    //释放空间
    for (int i = 0;i < 3;++i) {
        delete [] (DataSet[i]);
        DataSet[i] = NULL;
    } 

    delete[] DataSet;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/801238
推荐阅读
相关标签
  

闽ICP备14008679号