什么是KNN算法 ?
KNN的全稱是K Nearest Neighbors,通常翻譯為K最鄰近算法。是最基礎的一個分類算法。本文以 iris 鳶(yuan)尾花數據集為例詳細說明到底什么是KNN算法。
表征空間(特征空間)
在講解KNN算法之前,首先要給大家科普幾個基礎概念。有了這幾個概念我們再學習KNN算法就容易多了。
1、特征參數
2、表征空間(特征空間)
3、特征描述
特征參數比較容易理解,就是描述一個事物的有關參數。在iris鳶尾花數據集中就是iris.feature_names:sepal length (cm):花瓣長度;sepal width (cm):花瓣寬度;petal length (cm):萼片長度; petal width (cm):萼片寬度。
為了防止有人不明白這幾個名詞什么意思,我一個理工直男搞來了下面這張圖。大家再復習一下中學的生物知識。
把這四個參數合起來,就成為一個描述鳶尾花的表征空間(特征空間)。其數學描述為:【花瓣長度,花瓣寬度,萼片長度,萼片寬度】。我們可以根據該特征空間對鳶尾花進行描述,並進行后續的統計分類。
iris 數據集中包含了三種鳶尾花類型,分別是:0 Setosa 山鳶尾、 1 Versicolor 變色鳶尾、 2 Virginica 維吉尼亞鳶尾。
在這里我們應該可以看出來了,其實描述鳶尾花的這四個參數,是前面兩個一組描述花瓣,后面兩個一組描述萼片。而參數1:花瓣長度和參數4:萼片寬度沒有太大關系,參數2:花瓣寬度和參數3:萼片長度也沒有太大關系。但是,我們根據這四個參數就可以對鳶尾花進行一個比較完整的描述。
# 導入 iris 數據集 from sklearn.datasets import load_iris # 加載 iris 數據集 iris = load_iris() X,Y = iris.data, iris.target A = X[:,0] B = X[:,1] C = X[:,2] D = X[:,3] plt1.scatter(A[0:50], B[0:50], c = 'r') plt1.scatter(A[50:100], B[50:100], c = 'g') plt1.scatter(A[100:150], B[100:150], c = 'b') plt2.scatter(C[0:50], D[0:50], c = 'r') plt2.scatter(C[50:100], D[50:100], c = 'g') plt2.scatter(C[100:150], D[100:150], c = 'b')
花瓣特征: 萼片特征:
其中紅色為類別0:山鳶尾,綠色為類別1:變色鳶尾;藍色為類別2:維吉尼亞鳶尾。
我們可以看到不同類別的鳶尾花,其數據特征是不一樣的。也就是它們的表征空間描述是不同的。
在這里,我們應該大致明白特征參數和表征空間大概是怎么一個回事了。
KNN算法原理
在這里,我們再講解KNN算法就比較容易了。KNN算法就是在其表征空間中,求K個最鄰近的點。根據已知的這幾個點對其進行分類。
如果其特征參數只有一個,那么就是一維空間。
如果其特征參數只有兩個,那么就是二維空間。
如果其特征參數只有三個,那么就是三維空間。
如果其特征參數大於三個,那么就是N維抽象空間。
在表征空間中,不同點的距離采用如下所示的歐幾里得方法進行計算。
K值根據經驗選擇最合適的參數,太小不夠穩健,太大的話容易受樣本不足制約。也可以根據交叉驗證的方法,確定最優的K值。一般取5~10之間的一個數。
參考:https://cloud.tencent.com/developer/article/1574868
我這里不再贅述了。