基本原理:通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名;然後取前k個最相似的樣本,統計這k(一般不大於20)個樣本中出現最多的分類,設為新資料的分類。
新資料,訓練樣本集,樣本資料標籤(即分類),最近鄰(前k個最相似資料),最近鄰標籤
演算法實施:
首先提取要比較的特徵,確定各特徵的權重,進行「歸一化」,自動將數字特徵轉化為0-1之間——autonorm()函式。
其次準備好測試分類器。通常選用已有資料90%作為訓練樣本來訓練分類器,剩下10%去測試分類器。即已知測試資料的分類,再去拿分類器驗證,求出錯誤率。該函式應該自包含(可以在任何時候使用來測試分類效果)——classtest()函式。
然後演算法使用,使用歐氏距離公式,計算兩個向量點的距離。該向量就是資料中各個特徵值歸一化之後的數值組成的一維矩陣,可以用numpy進行運算;隨後將距離按照從小到大排序;再確定前k個距離最小元素坐在的主要分類,返回發生頻率最高的元素標籤——classify()函式。
knn演算法:
簡單案例,包含全部流程
#coding: utf-8
from numpy import *
import operator
def createdataset():
# 使用者自封閉測試的資料
group = array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1],[5,10],[10,5]])
labels = ['a','a','b','b','c','c']
return group,labels
def createdatatest():
tgroup = array([[1.1,1.0],[1.1,1.2],[0.1,0.0],[0.1,0.1],[5,9],[9.5,5]])
tlabels = ['a','a','b','b','c','c']
return tgroup,tlabels
def autonorm(dataset):
# 按行處理,歸一化
minx = dataset.min(0)
maxx = dataset.max(0)
ranges = maxx - minx
normdataset = zeros(shape(dataset))
m = dataset.shape[0]
normdataset = (dataset - tile(minx, (m,1)))/tile(ranges, (m,1))
return normdataset
def classify(inx, dataset, labels, k):
#用於輸入的向量inx,輸入訓練樣本集dataset,標籤響亮labels,鄰居數k
datasetsize = dataset.shape[0] # shape函式獲取第一維度的長度
sqdiffmat = (tile(inx, (datasetsize, 1)) - dataset)**2 # 取差的平方
distances = (sqdiffmat.sum(axis = 1)) ** 0.5 # inx與不同資料之間距離
sortd = distances.argsort() # 排序,返回索引值
classcount = {}
for i in range(k):
votelabel = labels[sortd[i]]
classcount[votelabel] = classcount.get(votelabel,0)+1 #計數加1
classsort = sorted(classcount.items(), \
key = operator.itemgetter(1), reverse=true) # 標籤統計數從大到小排
return classsort[0][0]
def classtest(dataset,labels,tdataset, tlabels):
errorcount = 0.0
m = dataset.shape[0]
for i in range(m):
result = classify(tdataset[i], dataset,labels,6)
if(result != tlabels[i]): errorcount += 1
print("the total error rate is: %f"%(errorcount/float(m)))
group, labels = createdataset()
# group = autonorm(group)
label = classify([0,0], group, labels, 3)
print(label)
# 錯誤率測試
tgroup, tlabels = createdatatest()
# tgroup = autonorm(tgroup)
classtest(group,labels,tgroup, tlabels)
機器學習實戰 K 近鄰演算法
簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...
機器學習實戰 k 近鄰演算法
本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...
機器學習實戰K 近鄰演算法
coding utf 8 from numpy import import operator import matplotlib import matplotlib.pyplot as plt defcreatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1...