k 近鄰學習是一種常用的監督學習方法,比如:判斷乙個人的人品,只需要觀察與他來往最密切的幾個人的人品好壞就可以得出,即「近朱者赤,近墨者黑」。
理論/原理:「物以類聚,人以群分」乙個對於knn演算法解釋最清楚的圖如下所示:
藍方塊和紅三角均是已有分類資料,當前的任務是將綠色圓塊進行分類判斷,判斷是屬於藍方塊或者紅三角。
當然這裡的分類還跟k值是有關的:
如果k=3(實線圈),紅三角佔比2/3,則判斷為紅三角;
如果k=5(虛線圈),藍方塊佔比3/5,則判斷為藍方塊。
由此可以看出knn演算法實際上根本就不用進行訓練,而是直接進行計算的,訓練時間為0,計算時間為訓練集規模n。
knn演算法的基本要素大致有3個:
1、k 值的選擇
2、距離的度量
3、分類決策規則
# -*- coding: utf-8 -*-
import numpy as np # 科學計算包numpy
import operator # 運算子模組
"""對未知類別屬性的資料集中的每個點依次執行一下操作:
(1)計算已知類別資料集中的點與當前點之間的距離
(2)按照距離遞增次序排序
(3)選取與當前點距離最小的k個點
(4)確定前k個點所在類別的出現頻數
(5)返回當前k個點出現頻數最高的類別作為當前點的**分類
近朱者赤,近墨者黑」
理論/原理:「物以類聚,人以群分」
"""# k-近鄰演算法
def knn(inx, dataset, labels, k): # 輸入向量,訓練資料,標籤,引數k
datasetsize = dataset.shape[0] # 資料個數
# 計算差值
"""tile函式:將輸入向量變成和訓練資料一樣的形狀
例如:輸入向量為[1.2, 1],
訓練資料為:
[[1.0, 1.1],
[1.0, 1.0],
[ 0, 0],
[ 0, 0.1]]
變換後為:
[[1.2, 1],
[1.2, 1],
[1.2, 1],
[1.2, 1]]
"""diffmat = np.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]] # 選擇k個距離最小的點,對應標籤
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1 # 統計頻數
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)
"""operator.itemgetter(1):返回前面classcount迭代器中的第1列
sorted中key指定按value值排序
reverse=true降序
"""return sortedclasscount[0][0] # 返回最多的,多數表決法
# 1.資料獲取
def createdataset():
group = np.array([
[1.0, 1.1],
[1.0, 1.0],
[0, 0],
[0, 0.1]
])labels = ['a', 'a', 'b', 'b']
return group, labels
# 檢視資料
group, labels = createdataset()
print("訓練資料:", group)
print("標籤:", labels)
# **
result = knn([1.2, 1], group, labels, 3)
print("**標籤為:", result)
#knn-k-最臨近演算法
#inx為待分類向量,dataset為訓練資料集
#labels為訓練集對應分類,k最鄰近演算法
def classify0(inx, dataset, labels, k):
datasetsize = dataset.shape[0]#獲得dataset的行數
diffmat = np.tile(inx, (datasetsize,1)) - dataset#對應的差值
sqdiffmat = diffmat**2 #差的平方
sqdistances = sqdiffmat.sum(axis=1) #差的平方的和
distances = sqdistances**0.5 #差的平方的和的平方根
#計算待分類向量與每乙個訓練資料集的歐氏距離
sorteddistindicies = distances.argsort() #排序後,統計前面k個資料的分類情況
classcount={}#字典
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]#labels得是字典才可以如此
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)#再次排序
return sortedclasscount[0][0]#第乙個就是最多的類別
機器學習 KNN K 最鄰近演算法
knn分類演算法,是理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個...
機器學習演算法之 KNN k鄰近演算法
k 鄰近演算法應該是機器學習中最簡單的演算法了,也很容易理解。場景 已知一組資料 點 並按照某些屬性對其進行了分類,比如 a,b,c,這就是資料的labels 對於新來的資料,已知其屬性,對其進行分類,加label。k近鄰對於如何分類的做法就是,根據屬性,1.求出未知點到已知所有點的距離 2.對所有...
機器學習演算法之 kNN k 鄰近演算法
knn 演算法 k 臨近演算法,最基本的機器學習演算法之一,簡單講就是已有標本資料,計算 的資料和每個標本資料的特徵距離 如歐氏距離 距離近的標本資料型別作為 資料的型別。原理 已有訓練樣本集,新的資料和訓練樣本特徵比較,訓練樣本集中取特徵最相似資料的標籤。一般來說先找前k個最相似的 資料,這就是k...