機器學習之K近鄰

2021-07-11 09:36:28 字數 3733 閱讀 1976

k近鄰演算法在機器學習演算法中是最容易理解並且是最容易使用的演算法,下面是機器學習實戰中對k近鄰演算法的注釋。

'''

created on sep 16, 2010

knn: k nearest neighbors

input: inx: vector to compare to existing dataset (1xn)

dataset: size m data set of known vectors (nxm)

labels: data set labels (1xm vector)

k: number of neighbors to use for comparison (should be an odd number)

output: the most popular class label

@author: pbharrin

'''from numpy import *

import operator

from os import listdir

defclassify0

(inx, dataset, labels, k):

datasetsize = dataset.shape[0] #shape函式讀取numpy矩陣或者陣列的指定維度長度

diffmat = tile(inx, (datasetsize,1)) - dataset#tile函式重複某個陣列,構成乙個新的陣列

sqdiffmat = diffmat**2

#每個元素進行平方

sqdistances = sqdiffmat.sum(axis=1)#sum按指定維度求和

distances = sqdistances**0.5

#每個元素開方

sorteddistindicies = distances.argsort()#argsort排序後得到原來資料的下標

classcount={} #定義乙個字典

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]#返回指定下標的標籤值

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

#更新字典,對指定key值對應的值加1操作

#sorted函式用來排列字典,items返回字典的元組對的列表,key是用列表的某個屬性作為關鍵字,reverse指定是否逆序排列

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

return sortedclasscount[0][0]

#建立資料集,返回陣列

defcreatedataset

(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['a','a','b','b']

return group, labels

#從檔案中解析資料

deffile2matrix

(filename):

fr = open(filename)#根據filename指定的檔案位址開啟檔案

numberoflines = len(fr.readlines()) #以行的形式讀取整個檔案

returnmat = zeros((numberoflines,3)) #分配空間用來接下來儲存特徵向量

classlabelvector = #分配空間用來接下來儲存特徵值對應的類別

fr = open(filename)#再一次開啟指定檔案

index = 0

for line in fr.readlines():#以行為單位遍歷整個文件

line = line.strip()#用於移除字串頭尾指定的字元(預設為空格)

listfromline = line.split('\t')#通過指定分隔符對字串進行切片

returnmat[index,:] = listfromline[0:3]#將在3維空間每個樣本的特徵向量存入returnmat

index += 1

#更新index

return returnmat,classlabelvector

defdrawing

(filemat,classlabels):

import matplotlib.pyplot as plt#匯入繪相簿

fig=plt.figure()#新建乙個figure物件

ax=fig.add_subplot(111)#增加乙個子視窗到fig

ax.scatter(filemat[:,1],filemat[:,2],15.0*array(classlabels),15.0*array(classlabels))#在指定視窗繪製散點圖

plt.show()#顯示視窗

#數值歸一化

defautonorm

(dataset):

minvals = dataset.min(0)

maxvals = dataset.max(0)

ranges = maxvals - minvals#得到最大值和最小值的差

normdataset = zeros(shape(dataset))#shape返回多維陣列最長維度,初始化normdataset容器

m = dataset.shape[0]

normdataset = dataset - tile(minvals, (m,1))#陣列每個元素減去最小值

normdataset = normdataset/tile(ranges, (m,1)) #得到最終歸一化結果

return normdataset, ranges, minvals#返回歸一化結果

defdatingclasstest

(): horatio = 0.50

#hold out 10%

datingdatamat,datinglabels = file2matrix('datingtestset2.txt') #載入特徵矩陣和特徵值

normmat, ranges, minvals = autonorm(datingdatamat)#返回歸一化後的特徵矩陣,區間和最小值

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errorcount = 0.0

for i in range(numtestvecs):#取前0.5的資料進行測試

classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:],datinglabels[numtestvecs:m],3)

print(("the classifier came back with: %d, the real answer is: %d") % (classifierresult, datinglabels[i]))

if (classifierresult != datinglabels[i]):

errorcount += 1.0

print(("the total error rate is: %f" )%(errorcount/float(numtestvecs)))

print(errorcount)

機器學習之k近鄰

knn演算法假設給定的訓練集中的例項都已經分好類了,對於新的例項,根據離它最近的k個訓練例項的類別來 它的類別。即這k個例項大多數屬於某個類別則該例項就屬於某個類別。比如k為5,離新例項a最近的5個樣本的情況為,3個樣本屬於a類,1個樣本屬於b類,乙個樣本屬於c類,那麼新例項a屬於a類。k值的選取可...

機器學習之k 近鄰演算法

k nearest neighbor演算法又叫knn演算法,這個演算法是機器學習裡面乙個比較經典的演算法,總體來說knn演算法是相對比較容易理解的演算法 定義 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別 2 相似度 就是指兩個點之...

機器學習之K近鄰簡介

機器學習之k近鄰簡介。knn是常見的監督學習演算法,輸入是例項的特徵向量,輸出是例項對應的類別。給定測試樣本,基於某種距離計算方法,計算出與其距離最近的k個訓練樣本,根據多數表決方法判定屬於哪個類別。典型的懶惰學習演算法,不具有顯示的學習過程。在接受資料時,不做處理,當真正計算的時候才按照演算法流程...