機器學習 KNN K 最鄰近演算法

2021-09-08 05:52:09 字數 3462 閱讀 2550

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...