K 近鄰演算法(kNN)詳解

2021-08-08 17:11:00 字數 2129 閱讀 8579

from numpy import *

import operator

#匯入科學計算包numpy和運算子模組

def creatdataset():

#建立資料集(樣本點集)和標籤

group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])

labels = ['a', 'a', 'b', 'b']

return group, labels

group, labels = creatdataset()

def classify0(inx, dataset, labels, k):

#k-近鄰演算法,inx表示輸入的要被分類的新資料,dataset表示用來訓練演算法的資料集(樣本點集),labels表示標籤,k表示用於選擇最近鄰居的數目(整數)

datasetsize = dataset.shape[0]

#dataset.shape[0]讀取資料集(樣本點集)第一維的長度

#歐氏距離公式d = ((x1 - x2)^2 + (y1 - y2)^2)^0.5,以下四行**完成了這個公式的運算

diffmat = tile(inx, (datasetsize, 1)) - dataset

#tile(inx, (datasetsize, 1))將inx重複datasetsize次,每次重複一遍,然後每個資料均與dataset相減

sqdiffmat = diffmat ** 2

sqdistances = sqdiffmat.sum(axis = 1)

#sqdiffmat.sum(axis = 1)表示將sqdiffmat中的資料橫向相加,例如[1.0, 1.1]橫向相加後就為[2.1]

distances = sqdistances ** 0.5

#sorteddistindicies = distances.argsort()

#distances.argsort()將得到的distances從小到大排序然後返回索引值給sorteddistindicies.例如:[3, 1, 4, 0]在執行argsort()後將返回[4, 2, 1, 3],因為排序後元組從小到大為[0, 1, 3, 4]每個元素在原始元組內的索引值為4、2、1、3

classcount = {}

#定義乙個字典,用於儲存不同標籤出現的次數

for i in range(k):

#迭代的取前k個樣本點的標籤,並計算每個標籤出現的次數,然後返回距離新資料最近的樣本點的標籤

voteilabel = labels[sorteddistindicies[i]]

#返回第sorteddistindicies[i]個樣本點的標籤並賦值給voteilabel

classcount[voteilabel] = classcount.get(voteilabel, 0) + 1

#dict.get(key,default=none)獲得classcount中voteilabel對應的值,然後加1再重新賦值給classcount中的voteiabel

sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = true)

#將classcount的鍵按classcount的值的大小從大到小進行排序,key = operator.itemgetter(1)表示獲取一域的值(第乙個域是零域),reverse = true表示降序排序

return sortedclasscount[0][0]

#返回classcount中value最大的key

result = classify0([1, 0.5], group, labels, 2)

print(result)

#將[1,0.5]作為測試點,檢測k-近鄰演算法是否正常將資料分類

creatdataset()建立的資料集和標籤在平面直角座標系中表示如下

輸入測試點後,k-近鄰演算法將會分別比較測試點與四個樣本點之間的距離,並把距離測試點最近的樣本點的標籤返回,這樣就可以確定測試點應該被打上哪個標籤。

K 近鄰演算法 KNN

knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...

k近鄰演算法 kNN

核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...

K近鄰演算法 KNN

k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...