knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。
通俗簡單的說,就是將這個樣本進行分類,怎麼分類,就是用該樣本的特徵與空間中其他樣本做計算距離,當出現大多數距離偏向於某個樣本類時,我們認為該樣本屬於這個類別。
舉例說明:**商品是按類進行售賣的,對於零食類商品a,b,c,**與銷量分別對應(19,1000),(89,500),(9.9,3000)對與電器類商品d,e,f,**與銷量分別為(1000,10),(499,30),(999,100),對於乙個未知的產品(300,80),我們使用knn演算法進行求解,我們假設k=3(k的值要時情況而定,沒有確定的),分別求出未知產品到這六個點的歐式距離,即:sqrt((x1-y1)**2+(x2-y2)**2)
計算出結果進行倒序排序,我們得出前三的點分別為:e,b,f。所以我們認為未知產品是電器類產品,當然實際生活中不能僅僅有**,銷量這兩個二維資料,可能是n維資料,歐式距離的公式也是一樣的,現實中也不僅僅有這兩個分類,knn提供了一種簡單的解決思路。其中a,b,c,d,e,f稱為訓練資料,未知資料稱為測試資料。
還有在進行計算時有時需要格式化一下資料,例如對於c產品與未知產品,明顯計算銷量所產生的資料要遠大於**,為了減小這個帶來的誤差,可以使用以下:
參考鏈結
def
normdata
(dataset):
maxvals = dataset.max(axis=0)#按列獲取最大值,並返回陣列
minvals = dataset.min(axis=0)
ranges = maxvals - minvals
retdata = (dataset - minvals) / ranges
return retdata, ranges, minvals
#!/user/bin/env python
#-*- coding:utf-8 -*-
import numpy as np
import operator as opt
defnormdata
(dataset):
#標準化訓練集資料
maxvals = dataset.max(axis=0)
minvals = dataset.min(axis=0)
ranges = maxvals - minvals
retdata = (dataset - minvals) / ranges
return retdata, ranges, minvals
defknn
(dataset, labels, testdata, k):
distsquaremat = (dataset - testdata) ** 2
# 計算差值的平方
distsquaresums = distsquaremat.sum(axis=1) # 求每一行的差值平方和,axis=0則按列計算
distances = distsquaresums ** 0.5
# 開根號,得出每個樣本到測試點的距離
sortedindices = distances.argsort() # 排序,得到排序後的下標
indices = sortedindices[:k] # 取最小的k個
labelcount = {} # 儲存每個label的出現次數,出現次數最多的就是我們要選擇的類別
for i in indices:
label = labels[i]
labelcount[label] = labelcount.get(label, 0) + 1
# 次數加一,使用字典的get方法,第一次出現時預設值是0
sortedcount = sorted(labelcount.items(), key=opt.itemgetter(1), reverse=true) # 對label出現的次數從大到小進行排序
return sortedcount[0][0] # 返回出現次數最大的label
if __name__ == "__main__":#測試程式
dataset = np.array([[2, 3], [6, 8]])#訓練集
normdataset, ranges, minvals = normdata(dataset)
labels = ['a', 'b']#訓練集分別為a和b類
testdata = np.array([3.9, 5.5])#測試資料
normtestdata = (testdata - minvals) / ranges#同樣需要將測試資料標準化
result = knn(normdataset, labels, normtestdata, 1)#k=1
print(result)
基於KNN的電影題材分類
我們主要來實踐 knn 分類演算法的案例 基於knn的電影題材分類 import numpy as np import pandas as pd from collections import counternumpy和pandas是 python 中常見的兩個庫 numpy 可以用來儲存和處理大型...
Python實現的KNN分類器
coding utf 8 created on 2016 4 24 author taiji1985 import numpy as np import operator import matplotlib.pyplot as plt 建立乙個測試用的資料集 defcreatedataset x n...
kNN分類演算法的Python實現
from numpy import import operator def createdataset group array 1.0,1.1 2.0,2.0 0,0 4.1,5.1 labels a b c d return group,labels def classify0 inx,datas...