先來說說概念,什麼事k近鄰演算法?
knn演算法的核心思想是用距離最近的k個樣本資料的分類來代表目標資料的分類。
其原理具體地講,存在乙個訓練樣本集,這個資料訓練樣本的資料集合中的每個樣本都包含資料的特徵和目標變數(即分類值),輸入新的不含目標變數的資料,將該資料的特徵與訓練樣本集中每乙個樣本進行比較,找到最相似的k個資料,這k個資料出席那次數最多的分類,即輸入的具有特徵值的資料的分類。
下面是一張很經典的圖:
運用knn演算法思想,距離最近的k個樣本的分類來代表測試資料的分類
當k=3時,距離最近的3個樣本在實線內,具有2個紅色三角和1個藍色正方形**,因此將它歸為紅色三角。
當k=5時,距離最近的5個樣本在虛線內,具有2個紅色三角和3個藍色正方形**,因此將它歸為藍色正方形。
優點 (1)監督學習:可以看到,knn演算法首先需要乙個訓練樣本集,這個集合中含有分類資訊,因此它屬於監督學習。
(2)通過計算距離來衡量樣本之間相似度,演算法簡單,易於理解和實現。
(3)對異常值不敏感
缺點 (4)需要設定k值,結果會受到k值的影響,通過上面的例子可以看到,不同的k值,最後得到的分類結果不盡相同。k一般不超過20。
(5)計算量大,需要計算樣本集中每個樣本的距離,才能得到k個最近的資料樣本。
(6)訓練樣本集不平衡導致結果不準確問題。當樣本集中主要是某個分類,該分類數量太大,導致近鄰的k個樣本總是該類,而不接近目標分類
一般情況下,knn有如下流程:
(1)收集資料:確定訓練樣本集合測試資料;
(2)計算測試資料和訓練樣本集中每個樣本資料的距離;
常用的距離計算公式:
歐式距離公式:d(x,y)=∑ni=1(xi−yi)2‾‾‾‾‾‾‾‾‾‾‾‾‾√d(x,y)=∑i=1n(xi−yi)2
曼哈頓距離公式:d(x,y)=∑ni=1|xi−yi|d(x,y)=∑i=1n|xi−yi|
(3)按照距離遞增的順序排序;
(4)選取距離最近的k個點;
(5)確定這k個點中分類資訊的頻率;
(6)返回前k個點**現頻率最高的分類,作為當前測試資料的分類。
---------------------
資料歸一化處理:
由於不同的資料在大小上差別較大,在計算歐式距離,整體較大的資料明細所佔的比重更高,因此需要對資料進行歸一化處理。
#歸一化處理函式
def autonorm(dataset):
minvals=dataset.min(0) #最小值
maxvals=dataset.max(0) #最大值
ranges=maxvals-minvals #最大最小值之差
normdataset=zeros(shape(dataset)) #構造零矩陣
m=dataset.shape[0] #行數,shape返回[nrow,ncol]
normdataset=dataset-tile(minvals,(m,1))#tile複製minval
normdataset=normdataset/tile(ranges,(m,1))
return normdataset,ranges,minvals
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...
k近鄰演算法 kNN
核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...
K近鄰演算法 KNN
k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...