knn演算法(k-nearest neighbors)可以說是機器學習演算法中最簡單的一種,類似於我們在入門程式的時候寫的hello world。說它簡單是因為淺顯易懂,即使沒有高深的的數學/**功底也能在短時間內理解這個演算法。
knn中文名字叫做k近鄰演算法,這是一種有監督學習中的分類演算法,演算法的輸出是類別標籤。那麼輸出標籤是由什麼決定的呢?是該樣本距離已經分好標籤的類中,哪個類別最近就把它規劃為這個標籤。這個同樣是按照距離劃分類別的聚類演算法kmeans有些相似,但kmeans屬於無監督學習中的聚類演算法。 關於有監督學習和無監督學習的區別在《機器學習入門1——概述》(中已經解釋過了。
前面有講到knn是按照距離劃分的演算法,那麼在該演算法中就至少會涉及到距離的確定。實際上在演算法中決定模型訓練方法的引數(官話叫超引數)有兩個,分別是分類個數(k)和空間距離(d),訓練方法如下:
1)準備訓練資料,對資料進行預處理(這是任何機器學習演算法都需要做的準備工作)
2)設定分類個數k,就是你打算將你擁有的資料分為幾個類。
3)隨機從訓練資料中選擇k個資料作為起始點,然後對剩餘的訓練資料中每乙個資料分別計算到這k個點的距離並排序。距離計算方法採用歐式距離的方法(還有一些計算距離的方法比如cosine距離、jaccard距離,它們的應用場景各不相同,會在後面的演算法中介紹到):
(x1,y1),(x2,y2)為a,b兩點的二維座標
4)遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為測試元組的類別。
5)計算誤差,然後更改k值繼續上述步驟訓練。選取效果最好的k值。下圖是k=3的時候的訓練過程
實現knn演算法的時候要考慮到以下幾個方面:
1)把乙個物體表示成向量
因為模型的輸入一定是數量化的資訊, 我們需要把現實生活中的物體表示成向量/矩陣/張量的形式。這也叫做"特徵工程", 英文叫feature engineering
2)標記好每個物體的標籤
3)計算兩個物體之間的相似度/距離
4)選擇合適的k
選取合適的k,需要確定好「決策邊界」。「決策邊界」決定了你這個模型是否存在過擬合的情況。下面我用一張圖來表示
**於貪心科技(
圖中用藍線畫出的部分就是傳說中的決策邊界。我們可以看到最左邊的決策邊界是一根直線,我們把它稱為是線性決策邊界,最右面的圖決策邊界最複雜,它的決策邊界並不是線性的。那麼問題來了,到底哪個決策邊界更好呢?個人認為針對現有的資料來說,當然是最右面的最好。因為該決策邊界分類後,所有的樣本全部被正確分類了。但是並不能保證,如果有新進來的資料,用這個決策邊界分類後還能得到最好的結果。我們把這種現象叫做過擬合(過擬合產生的原因主要是由於訓練資料樣本數過少導致),所以有些時候準確率並不是我們評價模型的唯一指標。
決策邊界尋找通常我們使用的方法是交叉驗證(cross validation),比如10折交叉驗證。解釋一下,我們在資料劃分的時候,將資料分為訓練集(training dataset)和測試集(testing dataset),交叉驗證需要我們在訓練集中劃分出一部分資料叫做驗證集(validation dataset)。舉個例子,10折交叉驗證就是把訓練資料分為10份,其中1份作為驗證集,剩下9份作為訓練集(比如9號資料作為驗證,0~8號用來訓練。訓練完成後下一輪將8號資料作為驗證,其它資料作為訓練,以此類推直到訓練集中所有份的資料都被當作驗證集後結束),這樣做的好處是每乙份資料即被作為了訓練集,也被作為了測試集。然後我們選取效果最好的劃分情況,用這個模型來進行測試集的測試。
注意:千萬不要用測試資料來調參, 資料量較少的時候可以增加折數
python中的機器學習工具包sklearn中提供了一些標準資料,在此我們選取鳶尾花(iris)資料作為knn演算法的資料集合。**如下:
"""
使用knn來實現函式的分類
資料採用的是經典的iris資料,是三分類問題
"""from sklearn.neighbors import kneighborsclassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score
# 讀取資料
iris = datasets.load_iris()
x = iris.data
y = iris.target
# 將資料分為訓練資料和測試資料
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2003)
# 構建knn模型,k值為3、並做訓練
clf = kneighborsclassifier(n_neighbors=3)
clf.fit(x_train, y_train)
# 計算準確率
acc = accuracy_score(y_test, clf.predict(x_test))
print ("accuracy is :%.3f" % acc)
得到的準確率大約在0.92左右
knn作為最簡單的機器學習演算法,對於並不複雜的資料集合足以應付了。但以下情況knn演算法是應付不了的:
1)當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。
2)時間複雜度較高。因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。
針對這些缺點,提出了一些對knn演算法的改進,當然也可以用其它的機器學習演算法,我會在以後的文章中進行介紹
機器學習 連續域分類 機器學習 分類和聚類
機器學習 分類和聚類 分類和回歸 邏輯回歸和knn 1 分類 使用已知的資料集 訓練集 得到相應的模型,通過這個模型可以劃分未知資料。分類涉及到的資料集通常是帶有標籤的資料集,分類是有監督學習。一般分為兩步,訓練資料得到模型,通過模型劃分未知資料。2.聚類 直接使用聚類演算法將未知資料分為兩類或者多...
knn聚類還是分類 聊聊聚類演算法
學模式識別的時候覺得聚類是個很簡單很基礎的東西,但到了實習工作以及保研面試的時候又發現其實聚類沒那麼簡單,這裡從淺入深,結合個人專案以及其他寫的不錯的部落格來聊聊聚類演算法,有寫的不對的地方歡迎指出 用於資料探勘的聚類演算法有哪些,各有何優勢?www.zhihu.com 09 聚類演算法 層次聚類 ...
機器學習 K NN分類
一 定義 1 k nn分類全稱為k近鄰法 k nearest neighbor 是一種基本回歸與分類方法 給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最近的k個例項,這k個例項中多數例項屬於某一類,就把該輸入例項分為這一類。2 好比說,你周圍的同學大都是些好學生,你也會被認為是好學...