K NN近鄰演算法詳解

2021-08-30 02:34:24 字數 2905 閱讀 2017

k-近鄰演算法屬於一種監督學習分類演算法,該方法的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。

(1) 需要進行分類,分類的依據是什麼呢,每個物體都有它的特徵點,這個就是分類的依據,特徵點可以是很多,越多分類就越精確。

(2) 機器學習就是從樣本中學習分類的方式,那麼就需要輸入我們的樣本,也就是已經分好類的樣本,比如特徵點是a , b2個特徵,輸入的樣本甲乙丙丁,分別為[[1.0, 1.1], [1.0, 1.0], [5.0, 1.1], [5.0, 1.0]]。 那麼就開始輸入目標值,當然也要給特徵了,最終的目標就是看特徵接近a的多還是b的多,如果把這些當做座標,幾個特徵點就是幾緯座標,那麼就是座標之間的距離。那麼問題來了,要怎麼看接近a的多還是b的多。

工作原理:存在乙個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似的資料,這就是k-近鄰演算法中k的出處,通常k是不大於20的整數。

#!/usr/bin/env python 

# -*- coding:utf-8 -*-

# 科學計算包

import numpy

# 運算子模組

import operator

# 資料樣本和分類模擬

# 手動建立乙個資料來源矩陣group 和資料來源的分類結果labels

def createdataset():

group = numpy.array([[1.0, 1.1], [1.0, 1.0], [5.0, 1.1], [5.0, 1.0]])

lables = ['a', 'a', 'b', 'b']

return group, lables

# 進行knn 演算法

# newinput為輸入的目標,dataset是樣本的矩陣,labels是分類,k是需要取的個數

def knnclassify(newinput, dataset, lables, k):

# 讀取矩陣的行數,也就是樣本數量

numsamples = dataset.shape[0]

print("numsamples = ", numsamples)

# 變成和dataset一樣的行數,行數 = 原來 * numsamples,列數 = 原來 * 1,然後每個特徵點和樣本的點進行相減

# (numsamples, 1)表示矩陣newinput變為三維,重複次數一次

diff = numpy.tile(newinput, (numsamples, 1)) - dataset

print("diff = ", diff)

# 平方

squareddiff = diff ** 2

print("squareddiff = ", squareddiff)

# axis = 0 按列求和,axis = 1 按行求和

squareddist = numpy.sum(squareddiff, axis=1)

print("squareddist = ", squareddist)

# 開根號,計算距離

distance = squareddist ** 0.5

print("distance = ", distance)

# 按大小逆序排序

sorteddistindices = numpy.argsort(distance)

print("sorteddistindices = ", sorteddistindices)

classcount = {}

for i in range(k):

# 返回距離(key)對應類別(value)

votelabel = labels[sorteddistindices[i]]

print("votelabel = ", votelabel)

if votelabel in classcount.keys():

value = classcount[votelabel]

classcount[votelabel] = value + 1

else:

classcount[votelabel] = 1

print("classcount: ", classcount)

# 返回占有率最大的

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

print("sortedclasscount = ", sortedclasscount)

return sortedclasscount[0][0]

if __name__ == '__main__':

dataset, labels = createdataset()

testx = numpy.array([0, 0])

k = 3

outputlabel = knnclassify(testx, dataset, labels, k)

print("your input is:", testx, "and classified to class: ", outputlabel)

總結:k-近鄰演算法是分類資料中最簡單最有效的演算法,是基於例項的學習,使用演算法時我們必須要有接近實際資料的訓練樣本資料。k-近鄰演算法必須儲存全部資料集,如果訓練資料集很大,必須使用大量的儲存空間。此外,由於必須對資料集中的每個資料計算距離值,實際使用時可能非常耗時;

k-近鄰演算法的另乙個缺陷是讓無法給出任何資料的基礎結構資訊,因此我們也無法知曉平均例項樣本和典型例項樣本具有什麼特徵。         

K 近鄰演算法(kNN)詳解

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

KNN近鄰演算法

knn近鄰演算法的核心思想 近朱者赤近墨者黑,誰離我近就是誰 分析過程 給乙個新資料,找距離新資料最近的前k個資料 找到k個資料中出現類別次數最多的那乙個 將新資料劃分為該類別 開發流程 載入資料 歸一化資料 對資料預處理 計算距離,並分類 測試程式 knn實現 from collections i...

K 近鄰演算法 KNN

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