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 的特徵向量的歐式距離,選取距離最小的...