機器學習 k近鄰演算法

2021-10-22 04:51:00 字數 4144 閱讀 9044

k近鄰演算法優缺點

k近鄰法(k-nearest neighbors)是由cover和hart於2023年提出的,它是懶惰學習(lazy learning)的著名代表。

k近鄰演算法簡單、直觀:給定乙個訓練資料集(其中的例項類別已定),對新的輸入例項,在訓練資料集中找到與該例項最接近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。

舉個栗子

1.給定了紅色和藍色的訓練樣本,綠色為測試樣本

2.計算綠色點到其他點的距離

3.選取離綠點最近的k個點

4.選取k個點中,同種顏色最多的類。

例如:k=1時,k個點全是藍色,那**結果就是class 1;

k=3時,k個點中兩個紅色乙個藍色,那**結果就是class 2

要素1:k值的選取k值過小,模型複雜,易過擬合

如果k太小,如1,則模型太複雜,容易學習到雜訊,非常容易判定為雜訊類別。換個簡單的說法,當k=1時,如果離測試點距離最近的是乙個雜訊值(無用資料),那麼判斷就會出錯。

過擬合:在訓練集上準確率非常高,而在測試集上準確率低。即:平時學習很好,考試很差;比如平時做的都是線性代數,但卻是去考概率論。

k值過大,模型簡單,易**錯誤

可以想象,如果k的值大到全部的訓練集,那麼判斷就會變成乙個簡單的比誰的個數多,如果a種類的個數最多,那麼毫無疑問的無論放的測試點是b,還是c,都會被判定為a

k值既不能過大,又不能過小,那麼如何選取k值

解決辦法:交叉驗證

交叉驗證:將原始資料進行分組,一部分做為訓練集另一部分做為驗證集,首先用訓練集對分類器進行訓練,在利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的效能指標.

舉個栗子

我們把樣本分成十等分,第一次取第十份為測試集,前九份為訓練集;第二次取第九份為測試集,其餘為訓練集…然後k取1,2,3…測出最合適的k值

要素2:距離度量

lp距離

p=1時,曼哈頓距離

p=2時,歐氏距離

p=∞時,為各維度距離中的最大值

歸一化特徵值的必要性

要素3:分類決策規則

多採用表決,也可基於距離遠近進行加權投票

多數表決規則等價於經驗風險最小化。

常用誤分類率評價knn效能,要使誤分類率最小,即經驗風險最小,需使得正確分類率最大,即多數表決:

k近鄰法的分類演算法描述步驟:

(1)輸入:訓練資料集為例項的特徵向量

t=,? ⃗_?∈?⊆ℝ?為例項的特徵向量,?_?∈?=為例項的類別,

i=1,2,…,n。給定例項特徵向量? ⃗。

(2)輸出:例項? ⃗所屬類別y。

(3)其實現步驟為:

根據給定的距離度量,在t中尋找與? ⃗最近鄰的k個點,

定義涵蓋這k個點的? ⃗的鄰域記作nk(? ⃗)。

從nk(? ⃗)中,根據分類決策規則決定? ⃗的類別:

說簡單點就是,在很多點組成的訓練集裡,放入乙個新的點,測試該點屬於什麼種類,把所有點和該點算乙個距離按距離排序,取前k個點,k個點中哪個類別的個數最多,我們就認為這個點也是這一類。

def

classify0

(inx, dataset, labels, k)

:# 用於分類的輸入向量是inx,輸入的訓練樣本集為dataset,標籤向量為labels,最後的引數k表示選擇鄰居的數目

# 標籤向量的元素數目和矩陣dataset的行數相同

datasetsize = dataset.shape[0]

# shape的功能是讀取矩陣的長度,比如shape[0]就是讀取矩陣第一維度的長度

diffmat = np.tile(inx,

(datasetsize,1)

)- dataset # tile(a,(x,y))將a在行重複x次,在列上重複y次

sqdiffmat = diffmat**

2 sqdistances = sqdiffmat.

sum(axis=1)

# numpy中的sum函式,輸入可以是列表,元組,陣列。對於陣列可以指定維度進行相加。預設為axis=none,sum將所有的元素相加

distances = sqdistances**

0.5 sorteddistindicies = distances.argsort(

)# 將元素從小到大排列,提取其對應的index(索引),然後輸出給sorteddistindicies,記錄的是下標

classcount =

# 字典

for i in

range

(k):

voteilabel = labels[sorteddistindicies[i]

] classcount[voteilabel]

= classcount.get(voteilabel,0)

+1sortedclasscount =

sorted

(classcount.items(

), key=operator.itemgetter(1)

, reverse=

true

)# key是乙個函式,reverse=true是倒序,由大到小

return sortedclasscount[0][0]

def

autonorm

(dataset)

:# 歸一化特徵值

minvals = dataset.

min(0)

maxvals = dataset.

max(0)

ranges = maxvals - minvals

normdataset = np.zeros(np.shape(dataset)

) m = dataset.shape[0]

normdataset = dataset - np.tile(minvals,

(m,1))

normdataset = normdataset/np.tile(ranges,

(m,1))

#element wise divide

return normdataset, ranges, minvals

優點

精度高,對異常值不敏感,無資料輸入假定

缺點計算複雜度高,空間複雜度高

如果僅資料集就幾十上百g,還每個點都算距離,顯然複雜度很高,t(kn)

對knn演算法進行改進,於是有了之後的kd樹演算法,樹形結構的複雜度(klog2 n)要低的多

機器學習 k 近鄰演算法

一.k 近鄰演算法概述 簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將資料的每個特徵與樣本集合中資...

機器學習 K近鄰演算法

用例一 from sklearn.neighbors import nearestneighbors import numpy as np x np.array 1,1 2,1 3,2 1,1 2,1 3,2 nbrs nearestneighbors n neighbors 2,algorithm...

機器學習 K近鄰演算法

工作原理 存在乙個訓練樣本資料集合,每組資料對應乙個標籤及分類 比如下邊例子為前兩個資料都為a類 輸入測試樣本後通過計算求出測試樣本與訓練樣本的歐氏距離d,取前k個最小的值,這k組資料對應的標籤分類最多的那種,就是測試樣本的標籤。訓練樣本資料 1.0,1.1 1.0,1.0 0,0 0,0.1 歐氏...