人工智能算法--KNN算法(C++实现)
蹭熱度ing
Knn算法,用于分類。
通過得到邏輯上的相近程度實(shí)現(xiàn)判斷,K值的大小體現(xiàn)的是一個(gè)容錯(cuò)的過程。
提高預(yù)測準(zhǔn)確度的方法:
調(diào)整K值,找到更好的K值(別太大,也別太小)
數(shù)據(jù)的預(yù)處理(有大佬說過,數(shù)據(jù)的預(yù)處理會比算法本身更重要)
邏輯距離的選擇(歐氏距離,閔式距離,切比雪夫距離….)
分類,就是一種選擇的過程。將事件抽象為狀態(tài)點(diǎn)。根據(jù)狀態(tài)點(diǎn)之間的距離,進(jìn)行度量。(如果不懂我在講什么,建議把‘動態(tài)規(guī)劃’的算法自己再研究深一點(diǎn))
下面放上自己用c++做的Knn算法(采用歐氏距離,k值選取為1(并不是一個(gè)好的選擇,但是我真的很不想自己手工去打那么多的數(shù)據(jù)集emmmmm)(rand函數(shù)可以參數(shù)隨機(jī)數(shù),要是自己沒事干了,可以去用那個(gè)玩一下))
下面那個(gè)算法,還是不那么好的,要是可以的話,可以多選大點(diǎn)的K值,然后再做一個(gè)概率的統(tǒng)計(jì)。再列一個(gè)表。(但C++玩這個(gè)確實(shí)沒意思)
main函數(shù)是隨手寫的一個(gè)測試函數(shù),感覺還能湊活著用。
這是用Python寫的KNN算法,會方便很多!點(diǎn)擊即可看
代碼如下:
#include <iostream> using namespace std;#include <cmath> #include <cstring> char classsify_KNN(int* INX, int **DataSet, int DataSetlen, char *label, int k) // 限定數(shù)據(jù)規(guī)模 {int *b = new int[DataSetlen];//設(shè)置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); }//=== 接下來用改寫選擇排序進(jìn)行減枝,降低時(shí)間復(fù)雜度 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; //這個(gè)隨便寫的一個(gè)數(shù)據(jù)集 }} 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; } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的人工智能算法--KNN算法(C++实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求多项式解(三种方法MATLAB)
- 下一篇: KNN算法--手写输入判断(Python