工作原理:存在乙個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最鄰近)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似資料,這就是k-臨近演算法的出處,通常k是不大於20的整數。最後選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。
演算法流程:
(1)收集資料
(2)準備資料:距離計算所需要的數值,最好是結構化的資料格式。
(3)分析資料
(4)訓練演算法:此步驟不適用於k-臨近演算法
(5)測試演算法:計算錯誤率
(6)使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-臨近演算法判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續處理。
來看乙個例子:
假如有一組資料已經做好了分類,(1,1.1)和(1,1)屬於a類,(0,0)(0,0.1)屬於b類
現在有一點(1,0),它應該屬於哪一類?
思路:(1)求出(1,0)到四個點之間的距離
(2)找出距離最近的k個點
(3)找出k個點中分類出現次數最多的那個
用到的python知識:
# -*- coding:utf-8 -*-
from numpy import *
import operator
#1.shape函式
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
print(group.shape[0])#輸出4,陣列行數
print(group.shape[1])#輸出2,陣列列數
print(group)
#2.tile函式
test=[1,0]
print(tile(test,(4,1)))
#輸出#[[1 0]
# [1 0]
# [1 0]
# [1 0]]
#3.sum函式
arr=array([[1,2,3],[4,5,6]])
print(arr.sum(axis=1))#將矩陣的每一行相加
#輸出[ 6 15]
print(arr.sum(axis=0))#將矩陣的每一列相加
#輸出[5 7 9]
#4.argsort函式:返回的是陣列值從小到大的索引值
array1=([1,3,2,7])
print(argsort(array1))
#輸出[0 2 1 3]
#5.sorted
#sorted(iterable, cmp=none, key=none, reverse=false)
#iterable:迭代物件,要排序的物件
#cmp:比較函式
#key:指定取待排序元素的哪一項進行排序,operator.itemgetter(1)獲取物件的第1個域的值,此處是按value值排序
#reverse:是否反轉,表示是否從高到低排序
dict=
print(sorted(dict.items(),key=operator.itemgetter(1)))
#結果:[('b', 5), ('a', 10), ('d', 15), ('c', 20)]
#reverse=true結果:[('c', 20), ('d', 15), ('a', 10), ('b', 5)]
python3**:
# -*- coding:utf-8 -*-
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
#intx:分類的輸入向量
#dataset:訓練樣本
#labels:標籤向量
#k:選擇最近鄰居的數目
def classify0(intx,dataset,labels,k):
datasetsize=dataset.shape[0]#陣列行數
#距離計算
diffmat=tile(intx,(datasetsize,1))-dataset#將輸入向量轉為行數為datasetsize的二維陣列,並計算與訓練樣本的差
sqdiffmat=diffmat**2#求陣列的2次方
sqdistances=sqdiffmat.sum(axis=1)#將矩陣的每一行相加
distances=sqdistances**0.5#求陣列的0.5次冪,也就是求平方根
#選擇距離最小的k個點
sorteddistindicies=distances.argsort()#根據距離將陣列的下標排序
classcount={}
#求出前距離最近的前k個點中出現最多的分類
for i in range(k):
voteilabel=labels[sorteddistindicies[i]]#遍歷前k個點,獲取每個點所屬分類
classcount[voteilabel]=classcount.get(voteilabel,0)+1#將類別作為key,出現的次數作為value,計算每個類別出現的次數
#排序sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
#測試group,labels=createdataset()
result=classify0([1,0],group,labels,3)
print(result)
距離計算:
(1)求兩個矩陣的差
輸入的資料為[1,0]:
訓練樣本集為:
[[1.0,1.1],
[1.0,1.0],
[0, 0],
[0,0.1]],是乙個二維陣列,也可以看作為乙個行為4列為2的矩陣,為了兩個矩陣可以相減,首先需要將輸入向量[1,0]轉換為乙個行數為4的二維陣列
經過tile(intx,(datasetsize,1))後輸入向量變為
[[1 0],
[1 0],
[1 0],
[1 0]]
然後減去訓練樣本集,求出兩個矩陣的差,差值為
[[ 0. -1.1]
[ 0. -1. ]
[ 1. 0. ]
[ 1. -0.1]]
(2)使用歐氏距離公式,計算兩個向量點之間的距離
首先求差值的2次方,結果為:
[[ 0. 1.21]
[ 0. 1. ]
[ 1. 0. ]
[ 1. 0.01]]
然後將矩陣的每一行相加得到:
[ 1.21 1. 1. 1.01]
然後開根
[ 1.1 1. 1. 1.00498756]
根據距離最近點排序
值 : 1 1 1.00498756 1.1
下標: 1 2 3 0
得到:
[1 2 3 0]
(3)選擇距離最小的k個點,此處k=3,也就是前3個點
從上一步得到排序後的下標,取前三個值,然後從lables標籤中取下標為1 2 3 的值,分別是a b b
求出出現頻率最高的類別,b出現兩次,a出現1次,因此推測[1,0]的分類結果是b
來自:機器學習實戰
python知識參考:
機器學習實戰 02 k臨近
採用測量不同特徵值之間的距離 優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用資料範圍 數值型和標稱型。工作原理 存在乙個樣本資料集,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料...
機器學習 01 K 臨近演算法學習
k nearest neighbor演算法又叫knn演算法,這個演算法是機器學習裡面乙個比較經典的演算法,總體來說knn演算法是相對比較容易理解的演算法。其中的k表示最接近自己的k個資料樣本。knn演算法和k means演算法不同的是,k means演算法用來聚類,用來判斷哪些東西是乙個比較相近的型...
機器學習實戰(一) K 近鄰演算法
簡單來說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類 優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新...