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

人工智能算法--KNN算法(C++实现)_第1张图片

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

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


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


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


代码如下:

#include 
using namespace std;

#include 
#include 
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;
}

你可能感兴趣的:(C++,智能算法)