簡單地說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類。
優點:精度高、對異常值不敏感、無資料輸入假定。
缺點:計算複雜度高、空間複雜度高。
適用範圍:數值型和標稱型。
對於該演算法更通俗的說法,拿到乙個資料a,計算其與資料集c中的資料的距離,通過使用特徵值進行求歐式距離。然後排序取出其前k相鄰的資料,前k個出現頻率最高的類別即作為該資料的類別。
knn可以用在區分電影、**、手寫數字識別等。
下面使用python可以匯入資料
from numpy import *
import operator
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
對未知屬性的資料集中的每個點依次執行下面的操作:
1. 計算已知類別的資料集中的點與當前點之間的距離;
2.按照距離遞增的順序排序;
3.選取與當前點距離最小的k個點;
4.確定前k個點所在類別的出現概率;
5.返回前k個點出現頻率最高的類別作為當前點的**分類。
k-近鄰演算法實現 參照《機器學習實戰》
def classify0(inx, dataset, labels, k):
datasetsize = dataset.shape[0] # 取資料集的行數
diffmat = tile(inx, (datasetsize, 1)) - dataset # numpy.tile將資料擴充套件成矩陣
# 便於與dataset直接進行相減 見下面詳解-_-
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis=1) # 在行的方向上計算和
首先進行歐氏距離的計算:比如 點(0, 0)與(1, 2)之間的距離計算:
numpy.tile([0,1], (3,1)) : 表示 在行方向重複3次,;列方向重複1次。
>>>array([[0, 1],
[0, 1],
[0, 1]])
numpy.tile([0,1], (1,3)) : 表示 在行方向重複1次,;列方向重複3次。
>>>array([[0, 1, 0, 1, 0, 1]])
# 接上
sorteddistindicies = distances.argsort() # 按索引進行從小到大排序
# [12.4, 5.6, 9.8] 索引排序後: [1, 2, 0] [5.6, 9.8, 12.4]
classcount = {} # 記錄各個類別出現的頻率
for i in range(k):
voteilabel = labels[sorteddistindicies[i]] # 獲取前k個出現的類別
# sorteddistindicies = [2, 3, 1, 0] sorteddistindicies[0] = [2]
# labels = ['a', 'a', 'b', 'b']
# labels[sorteddistindicies[0]] == labels[2] == 'b'
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1
# 類別計數 看前k個出現頻率最高的類別是誰
# 需要注意的一點 classcount.get(voteilabel, 0) 中的0是不可少和更改的
# 表示的是 如果該資料不存在 則返回0
以上部分是 選擇距離最小的k個點 。
sortedclasscount = sorted(classcount.iteritems(),
key = operator.itemgetter(1), reverse=true)
# dict.iteritems() 生成的乙個迭代器 與item有不同
# operator.itemgetter(1) :獲取物件的第1個域的值
# reverse=true 表示逆序排列 從大到小
return sortedclasscount[0][0]
使用:classify0([0,0], dataset, labels, 3) # k = 3
另外需要注意的點:
有些資料的屬性值在進行歐氏距離時可能與其他屬性值相差過大,這時就需要進行歸一化處理。
機器學習 k 近鄰 kNN 演算法
一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...
機器學習 k近鄰演算法 kNN
knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...
機器學習 KNN演算法 K 近鄰
如何計算測試樣本與y已分類樣本之間的距離 如何選擇k值 k值過大或過小的影響 k值過小 例如k 1,結果對近鄰的例項點非常敏感,容易受到雜訊影響,發生過擬合 k值過大 可以一定程度上避免上述情況,但是現有訓練集的訓練誤差會增大,輸入不相似的訓練例項會導致 錯誤 適合分類問題,有較高的精確度,對異常值...