本章介紹機器學習實戰的第乙個演算法——k近鄰演算法(k nearest neighbor),也稱為knn。說到機器學習,一般都認為是很複雜,很高深的內容,但實際上其學習門欄並不算高,具備基本的高等數學知識(包括線性代數,概率論)就可以了,甚至一些演算法高中生就能夠理解了。knn演算法就是乙個原理很好理解的演算法,不需要多好的數學功底,這是乙個分類演算法(另乙個大類是回歸),屬於監督學習的範疇(還有非監督學習,監督學習需要注有標記的訓練集)。
首先,分類顧名思義就是給同一種事物分成不同的種類,比如人分成男人、女人,書分為工具書,教科書,漫畫書等。要對乙個事物分類,要有分類的依據,即你為什麼這樣劃分,有時候劃分的依據十分準確比如男女按性別,但很多時候是由多個因素來決定劃分到哪乙個類別,而不同的分類某一單一的因素又可能存在交集,這些因素在機器學習中被稱之為特徵,特徵的選擇對演算法的準確率也是有影響的。個體用一組特徵資料來進行描述,這樣計算機處理就成了可能,分類演算法所要做的就是判斷這個個體所給出的特徵屬於哪乙個類別。方法有很多,knn採取了乙個最簡單的方法來判斷:判斷其與已知分類的訓練集資料的差異,差異最小的前k個訓練集個體大部分處於哪個分類該輸入個體就被認作是哪個分類。
這個原理很好理解,比如判斷男女,特徵只有身高,體重。通常來說男人都比女人要高和重,即便女人要高,體重也比同等級的男人大部分會輕。所以對於乙個輸入個體來說,在已知身高、體重的情況下,求其與訓練集樣本的身高、體重差異,找到訓練集中差異最小的k個個體,這k個個體如果大部分是男人,則輸入樣本就是男人,否則則是女人。選擇差異最小的k個個體也就是為了避免小部分不同尋常的樣本,因為男人都比女人要高和重也只是大部分情況,這樣選擇k個的權重,可信度就較高了。差異計算一般採用歐式距離,即各個特徵相減,求平方和,開根號:
上圖就是差異的定義了,這樣挑選出k個最小的訓練集,已知這些訓練集的分類,選擇k個訓練集大部分所屬的分類就是新輸入個體的分類了。
knn演算法的原理簡單易懂,但是在實現過程中也是有些問題需要解決的。首先我們需要關注d的計算,knn選擇的是d最小的k個訓練集個體,所以d的結果合理性是很重要的。但是由該公式可以很明顯的看出,d的大小很可能受到某一單一的特徵影響。試想一下如果x的取值範圍在1~10,y的取值範圍在1000~10000,那麼d的大小嚴重受到y特徵的影響,那麼x的作用就幾乎沒有了。解決該問題的方法就是將數值歸一化,意思就是不管x還是y,按照合理的放縮方法,使他們落在同乙個範圍區間,一般就選擇0~1之間了。這個放縮方法也並不難得出,公式如下:
優點:精度高,對異常值不敏感,無資料輸入假定
缺點:計算複雜度高、空間複雜度高
從knn的實現上也能看出來,其計算代價較高,每個個體都需要和所有的訓練集個體進行比較,而且knn演算法無法獲得指定分類的一般性特徵,因此其不適合大量的訓練集。
def classify0(inx, dataset, labels, k):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.iteritems(), 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
機器學習實戰(一) K 近鄰演算法
簡單來說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類 優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新...
《機器學習實戰》 K 近鄰演算法
基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...
機器學習實戰 K 近鄰演算法
簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...