機器學習之kNN算法

一、概述

1.1 KNN簡介

​ kNN算法:即K最近鄰(kNN,k-NearestNeighbor)分類算法

​ KNN是一種分類(classification)算法,它輸入基於實例的學習(instance-based learning),屬於懶惰學習(lazy learning),即KNN沒有顯式的學習過程,也就是說沒有訓練階段,數據集事先已有了分類和特徵值,待收到新樣本後直接進行處理。與急切學習(eager learning)相對應。

​ KNN通過測量不同特徵值之間的距離進行分類。

img

img

1.2 補充

img

1.3 何時使用KNN?

sklearn算法选择

二、算法思想

img

2.1 判斷電影類別

img

img

img

2.2 判斷點的類別

​ 要確定綠點屬於哪個顏色(紅色或者藍色),要做的就是選出距離目標點距離最近的k個點,看這k個點的大多數顏色是什麼顏色。

​ 當k取3的時候,我們可以看出距離最近的三個,分別是紅色、紅色、藍色,因此得到目標點爲紅色。

img

example

三、建模流程

img

四、算法描述

4.1 基本流程

  • 計算測試數據與各個訓練數據之間的距離;

  • 按照距離的遞增關係進行排序;

  • 選取距離最小的K個點;

  • 確定前K個點所在類別的出現頻率;

  • 返回前K個點中出現頻率最高的類別作爲測試數據的預測分類

4.2 注意要點

img

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)、海明距離、歐式距離等。

例如:歐式距離

img

曼哈頓距離

img

4.5 KNN迴歸

img

5.總結

5.1 kNN的缺點

img

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文件

img

img

6.2 約會網站配對

詳情:點擊這裏

6.3 手寫識別案例

• 詳情 https://github.com/Jenny0611/Ml_Learning01

6.4 識別鳶尾花

詳情:點擊這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章