-
1.分類問題(物以類聚)
學會 kNN 算法,只需要三步:
-
了解 kNN 算法思想
-
掌握它背后的數學原理(別怕,初中就學過,歐式距離)
-
最后用簡單的 Python 代碼實現
公眾號【高級農民工】2019-06-04的文章“Python手寫機器學習最簡單的KNN算法”,作者舉了個特別易懂的場景來解釋KNN。
https://blog.csdn.net/weixin_42232219/article/details/91350124
酒吧老板:你眼前的這十杯紅酒,每杯略不相同,前五杯屬於「赤霞珠」,后五杯屬於「黑皮諾」。現在,我重新倒一杯酒,你只需要根據剛才的十杯正確地告訴我它屬於哪一類。
你沒有急着品酒而是問了老板每杯酒的一些具體信息:酒精濃度、顏色深度等,以及一份紙筆。老板一邊倒一杯新酒,你邊瘋狂打草稿。很快,你告訴老板這杯新酒應該是「赤霞珠」。
老板問怎么做到的,你說:無他,但機器學習熟爾。
上面的每一杯酒稱作一個「樣本」,十杯酒組成一個樣本集。酒精濃度、顏色深度等信息叫作「特征」。這十杯酒分布在一個多維特征空間中。說到空間,我們最多能感知三維空間,為了理解方便,我們假設區分赤霞珠和黑皮諾,只需利用:酒精濃度和顏色深度兩個特征值。這樣就能在二維坐標軸來直觀展示。
該算法首先需要取一個參數 K,機器學習中給的經驗取值是 3,我們假設先取 3 ,具體取多少以后再研究。對於每個新來的點,K 近鄰算法做的事情就是在所有樣本點中尋找離這個新點最近的三個點,統計三個點所屬類別然后投票統計,得票數最多的類別就是新點的類別。
1.原理:它的本質就是通過距離判斷兩個樣本是否相似,如果距離夠近就覺得它們相似屬於同一個類別。當然只對比一個樣本是不夠的,誤差會很大,要比較最近的 K 個樣本,看這 K 個 樣本屬於哪個類別最多就認為這個新樣本屬於哪個類別。
2.數學原理
歐拉公式
3.Python代碼實現
作者提供的代碼要用jupyter notebook打開,鼓搗半天還沒打開,先睡了。。。
機器學習 -- KNN算法(Ⅲ 腫瘤預測案例 -- 封裝成函數)https://blog.csdn.net/m0_38056893/article/details/102987230?ops_request_misc=%7B%22request%5Fid%22%3A%22158181892419724847039085%22%2C%22scm%22%3A%2220140713.130056874..%22%7D&request_id=158181892419724847039085&biz_id=0&utm_source=distribute.pc_search_result.none-task
1 import numpy as np 2 3 from collections import Counter 4 5 6 def kNN_classify(k, X_train, y_train, x): 7 """ 8 9 kNN分類實現 10 11 :param k: 選取的最近k個點 12 13 :param X_train: 訓練集的特征值 14 15 :param y_train: 訓練集的目標值 16 17 :param x: 待預測數據集 18 19 :return: 預測結果 20 21 """ 22 23 # 用斷言保證用戶輸入數據合法 24 25 assert 1 <= k <= X_train.shape[0], "k必須為有效值" 26 27 assert X_train.shape[0] == y_train.shape[0], "訓練集X和y的大小必須相同" 28 29 assert X_train.shape[1] == x.shape[0], "待測數據x的特征數必須和訓練集X一致" 30 31 # 獲取所有樣本點和待測點的距離 32 33 distances = [] 34 35 for x_train in X_train: 36 d = (np.sum((x_train - x) ** 2)) ** 0.5 37 38 distances.append(d) 39 40 sorted_index = np.argsort(distances) 41 42 top_K = [y_train[i] for i in sorted_index[:k]] 43 44 return Counter(top_K).most_common(1)[0][0] # [(1, 5)] 45 46 47 def loadData(): 48 """ 49 50 加載數據集(這里只是通過手動的方式構造數據集,之后會使用文件讀取的方式) 51 52 :return: 訓練集的特征值X_train的numpy數組, 訓練集的目標值y_train的numpy數組 53 54 """ 55 56 raw_data_X = [[3.3935, 2.3312], 57 58 [3.1101, 1.7815], 59 60 [1.3438, 3.3684], 61 62 [3.5823, 4.6792], 63 64 [2.2804, 2.8670], 65 66 [7.4234, 4.6965], 67 68 [5.7451, 3.5340], 69 70 [9.1722, 2.5111], 71 72 [7.7928, 3.4241], 73 74 [7.9398, 0.7916]] 75 76 raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] 77 78 X_train = np.array(raw_data_X) 79 80 y_train = np.array(raw_data_y) 81 82 return X_train, y_train 83 84 85 if __name__ == "__main__": 86 # 獲取數據集 87 88 X_train, y_train = loadData() 89 90 # 待預測數據 91 92 x = np.array([8.0936, 3.3657]) 93 94 k = 6 95 96 print(kNN_classify(k, X_train, y_train, x))
輸出結果:1
以上代碼在Pycharm 運行成功,文件名為“KNN20200216”
-
問題1 :怎樣用讀取文本的方式加載數據集???
-
問題2:嘗試用sklearn寫KNN
-
問題3:代碼92行 預測數據怎么寫多個???
KNN特別適合多分類問題(multi-modal,對象有多個類別標簽),優於其他機器學習算法,也最簡單。KNN分類很容易理解,就是物以類聚的思想,找到和樣本特征最近的幾個。
要學會Excel中數據怎么矩陣做參數?