機器學習實戰 k 臨近演算法(一)

2021-08-02 10:17:33 字數 4148 閱讀 8546

工作原理:存在乙個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最鄰近)的分類標籤。一般來說,我們只選擇樣本資料集中前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 近鄰演算法採用測量不同特徵值之間的距離方法進行分類 優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新...