一、k-近鄰演算法概述
適用於:數值型和標量型
(1)收集資料
(2)準備資料:向量點距離
(3)按照距離遞增次序排序
(4)選取與當前距離最小的k個點
(5)確定選擇k個點所在類別的頻率
(6)判斷當前點的的類別
二、k-近鄰演算法實現(python語言實現)
共有資料1000行,含有三個資料特徵:
每年獲得的飛行里程數
每週消費的冰淇淋公升數
(3)解析資料
將numpy的矩陣資料分解成三組3中特徵的陣列
(4)分析資料:使用matplotlib建立散點圖,分析結果
#繪製散點圖,title1和title2表示點的名稱
def drawdots(title1,title2,labelx1,labely1,labelx2,labely2,labelx3,labely3):
plt.figure(figsize=(8, 5), dpi=80)
axes = plt.subplot(111)
label1 = axes.scatter(labelx1, labely1, s=20, c="red")
label2 = axes.scatter(labelx2, labely2, s=20, c="green")
label3 = axes.scatter(labelx3, labely3, s=20, c="blue")
plt.xlabel(title1)
plt.ylabel(title2)
axes.legend((label1, label2, label3), ("don't like", "attraction common", "attraction perfect"), loc=2)
plt.show()
(5)knn演算法
#使用k-近鄰演算法對輸入的資料進行分類
def knn_classify(inx,datamat,labels,k):
'''inx:輸入的向量
datamat:訓練樣本資料集
labels:訓練樣本的分類標籤
k:選擇近鄰的個數
'''#計算矩陣的行數
datasize = datamat.shape[0]
#計算距離
diffmat = np.tile(inx,(datasize,1)) - datamat
sqdiffmat = diffmat**2
sqdistance = sqdiffmat.sum(axis=1)
distance = sqdistance**0.5
#對距離進行排序,然後提取其索引賦值給sorteddistance
sorteddistance = distance.argsort()
classcount={}
for i in range(k):
votelabel = labels[sorteddistance[i]]
classcount[votelabel] = classcount.get(votelabel,0)+1
sortedclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
(6)特徵向量歸一化
#歸一化特徵值
def normalize(datamat):
#求最小距離的向量
minval = datamat.min(0)
#求最大距離的向量
maxval = datamat.max(0)
#最值向量的差距
ranges = maxval - minval
#特徵向量初始化
normdatamat = np.zeros(np.shape(datamat))
#向量數
matsize = datamat.shape[0]
#求特徵值向量
normdatamat = datamat - np.tile(minval,(matsize,1))
normdatamat = normdatamat / np.tile(ranges,(matsize,1))
return normdatamat,ranges,minvalresultmat,resultlabel = getmatrixfrmfile("datingtestset2.txt")
(7)測試分類器
#測試分類器
def testdatingclassifier():
#測試資料的佔總資料集的百分比
rate = 0.15
#從檔案讀取資料集和標籤
datingdatamat,datinglabels = getmatrixfrmfile("datingtestset2.txt")
labelx1,labely1,labelz1,labelx2,labely2,labelz2,labelx3,labely3,labelz3=handledata(datingdatamat,datinglabels)
drawdots("flying distance","time for playing video game per week",labelx1,labelz1,labelx2,labelz2,labelx3,labelz3)
drawdots("number of comsuming icecream per week","time for playing video game per week",labely1,labelz1,labely2,labelz2,labely3,labelz3)
drawdots("flying distance","number of comsuming icecream per week",labelx1,labely1,labelx2,labely2,labelx3,labely3)
#資料集歸一化
normmat,ranges,minvals = normalize(datingdatamat)
#計算測試資料的個數
m = datingdatamat.shape[0]
numoftest = int(rate*m)
#初始化出錯數
errornumber=0
#測試numoftest個資料
for i in range(numoftest):
classifiedresult = knn_classify(normmat[i,:],normmat[numoftest:m,:],datinglabels[numoftest:m],3)
#print("分類%d,結論是:%d" % (classifiedresult,datinglabels[i]))
if classifiedresult != datinglabels[i]:
errornumber+=1.0
print("總的正確率是%f" %(1-errornumber/float(numoftest)))
(8)測試執行結果
執行結果如下:
從執行結果可以發現:
每年獲得的飛行里程數和每週消費的冰淇淋公升數兩個特徵對結果影響大
學習筆記34 k近鄰演算法
k nearest neighbor knn 這是一種分類演算法,它的核心思想是 對於新的樣本,根據其k個最近鄰的樣本的類別,通過多數表決等決策規則,決定它的類別。使用k近鄰演算法,首先需要確定三個東西 距離度量,k值的選擇,分類決策規則 特徵空間中兩個樣本點之間的距離反映了這兩個樣本的相似程度,距...
學習筆記(一)k 近鄰演算法(KNN)
終於找到 機器學習實戰 這本書了,在此記錄一些總結,便於回顧。knn的工作原理是 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中...
機器學習筆記之K近鄰演算法
今天學習的是機器學習中最為簡單的乙個演算法 k近鄰演算法,簡稱knn。由於學習主要參照 機器學習實戰 這本書進行,本系列文章中涉及到的概念與例項絕大部分 於此。本文主要從knn演算法概述,使用k 近鄰演算法改進約會網 的配對效果,手寫識別函式三個方面來展開,本文的主要用意在於闡釋 機器學習實戰 中源...