文章目錄
一、概述
1.1 KNN簡介
kNN算法:即K最近鄰(kNN,k-NearestNeighbor)分類算法
KNN是一種分類(classification)算法,它輸入基於實例的學習(instance-based learning),屬於懶惰學習(lazy learning),即KNN沒有顯式的學習過程,也就是說沒有訓練階段,數據集事先已有了分類和特徵值,待收到新樣本後直接進行處理。與急切學習(eager learning)相對應。
KNN通過測量不同特徵值之間的距離進行分類。
1.2 補充
1.3 何時使用KNN?
二、算法思想
2.1 判斷電影類別
2.2 判斷點的類別
要確定綠點屬於哪個顏色(紅色或者藍色),要做的就是選出距離目標點距離最近的k個點,看這k個點的大多數顏色是什麼顏色。
當k取3的時候,我們可以看出距離最近的三個,分別是紅色、紅色、藍色,因此得到目標點爲紅色。
三、建模流程
四、算法描述
4.1 基本流程
-
計算測試數據與各個訓練數據之間的距離;
-
按照距離的遞增關係進行排序;
-
選取距離最小的K個點;
-
確定前K個點所在類別的出現頻率;
-
返回前K個點中出現頻率最高的類別作爲測試數據的預測分類
4.2 注意要點
4.3 K的取值
-
K:臨近數,即在預測目標點時取幾個臨近的點來預測。
-
K的取值過小:一旦有噪聲得成分存在們將會對預測產生比較大影響。K值爲1時,一旦最近的一個點是噪聲,那麼就會出現偏差,K值的減小就意味着整體模型變得複雜,容易發生過擬合。
-
K的取值過大:即用較大鄰域中的訓練實例進行預測,學習的近似誤差會增大。與輸入目標點較遠實例也會對預測起作用,使預測發生錯誤。K值的增大也就意味着整體的模型變得簡單。
-
K==N時,那麼就是取全部的實例,即爲取實例中某分類下最多的點,就對預測沒有什麼實際的意義了。
-
K的取值儘量要取奇數,以保證在計算結果最後會產生一個較多的類別,如果取偶數可能會產生相等的情況,不利於預測。
-
常用的方法是從k=1開始,使用檢驗集估計分類器的誤差率。重複該過程,每次K增值1,允許增加一個近鄰。選取產生最小誤差率的K。
-
一般k的取值不超過20,上限是n的開方,隨着數據集的增大,K的值也要增大。
4.4 距離的選取
常用的方法有:餘弦值(cos), 相關度 (correlation), 曼哈頓距離 (Manhattan distance)、海明距離、歐式距離等。
例如:歐式距離
曼哈頓距離
4.5 KNN迴歸
5.總結
5.1 kNN的缺點
6.kNN算法的實現及其實戰
6.1 判斷點是哪個類別
# kNN.py
# 分類器
def classify0(inX, dataSet, labels, k):
'''
:param inX:
:param dataSet: 數據集合 矩陣
:param labels: 類別名
:param k: K值 int
:return: 判斷的類別名
'''
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# 建立數據集
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
注:kNN是自己寫的一個kNN.py文件
6.2 約會網站配對
詳情:點擊這裏
6.3 手寫識別案例
• 詳情 https://github.com/Jenny0611/Ml_Learning01
6.4 識別鳶尾花
詳情:點擊這裏