本文正在參加「Python主題月」,詳情查看 活動連接python
最簡單最初級的分類器是將所有的訓練數據所對應的類別都記錄下來,當測試對象的屬性和某個訓練對象的屬性徹底匹配時,即可以對其進行分類。可是怎麼可能全部測試對象都會找到與之徹底匹配的訓練對象呢,其次就是存在一個測試對象同時與多個訓練對象匹配,致使一個訓練對象被分到了多個類的問題,基於這些問題呢,就產生了KNN。算法
KNN是經過測量不一樣特徵值之間的距離進行分類。它的思路是:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,其中K一般是不大於20的整數。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。markdown
下面經過一個簡單的例子說明一下:以下圖,綠色圓要被決定賦予哪一個類,是紅色三角形仍是藍色四方形?若是K=3,因爲紅色三角形所佔比例爲2/3,綠色圓將被賦予紅色三角形那個類,若是K=5,因爲藍色四方形比例爲3/5,所以綠色圓被賦予藍色四方形類。由此也說明了KNN算法的結果很大程度取決於K的選擇。數據結構
在KNN中,經過計算對象間距離來做爲各個對象之間的非類似性指標,避免了對象之間的匹配問題,在這裏距離通常使用歐氏距離或曼哈頓距離:app
同時,KNN經過依據k個對象中佔優的類別進行決策,而不是單一的對象類別決策。這兩點就是KNN算法的優點。post
接下來對KNN算法的思想總結一下:就是在訓練集中數據和標籤已知的狀況下,輸入測試數據,將測試數據的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最爲類似的前K個數據,則該測試數據對應的類別就是K個數據中出現次數最多的那個分類,其算法的描述爲:測試
1)計算測試數據與各個訓練數據之間的距離;spa
2)按照距離的遞增關係進行排序;3d
3)選取距離最小的K個點;code
4)肯定前K個點所在類別的出現頻率;
5)返回前K個點中出現頻率最高的類別做爲測試數據的預測分類。
預測幸福感
咱們把數據按照[月薪(萬元)、加班(小時)、通勤(小時)]
格式處理
data_happy = [
[1.5, 1.5, 0.5], [1.6, 2.1, 0.2], [1.8, 1.4, 0.5], [1.5, 2.0, 0.3],
[1.7, 1.0, 0.4],
[1.3, 1.0, 0.3], [1.5, 2.0, 0.5], [1.4, 1.7, 0.4], [1.6, 0.5, 0.5],
[1.9, 2.0, 0.3],
]
data_sad = [
[0.8, 2.3, 0.8], [1.0, 2.6, 0.9], [2.0, 1.0, 0.5], [1.2, 3.0, 1.1],
[1.8, 3.5, 1.3],
複製代碼
咱們訓練一個AI的方法: 已有數據 → 訓練出模型 → 新數據(XX 同窗:月薪 1.5 萬元、 加班 2 小時、通勤 0.8 小時) → 預測其幸福感
經過上面那張圖咱們知道 K 的取值比較重要,那麼該如何肯定 K 取多少值好呢? 答案是經過交叉驗證(將樣本數據按照必定比例,拆分出訓練用的數據和驗證用 的數據,好比 9:1 拆分出部分訓練數據和驗證數據),從選取一個較小的 K 值 開始,不斷增長 K 的值,而後計算驗證集合的方差,最終找到一個比較合適的 K 值。 經過交叉驗證(輪流將其中 9 份作訓練 1 份作驗證)計算方差,大體會獲得下面 這樣的圖:
k 近鄰算法,分爲 4 大步驟: