機器學習實戰 k近鄰演算法

2021-08-19 23:27:40 字數 4398 閱讀 9082

knn演算法具體描述可以參見李航的《統計學習方法》

knn演算法的偽碼過程如下:

(1)計算已知類別資料集中的點與當前點之間的距離;

(2)按照距離遞增次序排序;

(3)選取與當前點距離最小的k個點;

(4)確定前k個點所在類別的出現頻率;

(5)返回前k個點出現頻率最高的類別作為當前點的**分類;

knn**詳解如下:

def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0] #首先獲取已知類別資料點的個數,既輸入特徵矩陣的行數

diffmat = tile(inx, (datasetsize,1)) - dataset

#tile函式是numpy庫中的乙個模組,此處具體的功能是講向量inx按照行方向重複datasetsize次,列方向重複1次。

sqdiffmat = diffmat**2 #求矩陣diffmat中每個元素的平方

sqdistances = sqdiffmat.sum(axis=1) #將矩陣sqdiffmat每一行求和

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()

#argsort()函式是numpy的模組,此處用來返回distances元素從小到大排序好之後的索引

classcount={} #建立字典,將用來存放k個點中的標籤種類和對應的出現次數

for i in range(k):

voteilabel = labels[sorteddistindicies[i]] #取到前k個點的類別

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

#此句與迴圈結合,目的是用來統計某一類別標籤在k個點中出現的次數

#get函式,用來返回鍵voteilabel的值,如果不存在,就返回0,如果存在就返回該值,並加1

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

#sorted()函式用法:python的build-in函式 sorted(iterable, cmp=none, key=none, reverse=false) --> new sorted list

#iterable是可迭代型別;

#cmp:用於比較的函式,比較什麼由key決定;

#key:用列表元素的某個屬性或函式(此例中是函式)進行作為關鍵字,有預設值,迭代集合中的一項;

#reverse:排序規則. reverse = true 降序 或者 reverse = false 公升序,有預設值。

#返回值:是乙個經過排序的可迭代型別,與iterable一樣。

#iteritems()函式用法:此處將字典classcount轉變成可迭代的物件,書上說是分解為元祖列表

#operator.itemgetter(1):定義乙個函式,用於獲取物件的哪些維的資料,引數為一些序號(即需要獲取的資料在物件中的序號)

return sortedclasscount[0][0] #返回出現次數最大的那個類別標籤

def file2matrix(filename): #將文字記錄轉換為numpy的解析程式

fr=open(filename) #開啟檔案,並且返回乙個表示檔案的物件

arrayolines = fr.readlines() #readlines()方法讀取整個檔案所有行,儲存在乙個列表(list)變數中,每行(字串型別)作為乙個元素,但讀取大檔案會比較佔記憶體。

numberoflines = len(arrayolines) #獲取列表的元素個數,既讀入檔案的行數

returnmat = zeros((numberoflines,3)) #zeros函式的返回物件是numpy中的array陣列結構

classlabelvector = #建立乙個空列表,用來存放類別

index = 0

for line in arrayolines:

line = line.strip() #刪除每一行資料的頭和尾的空格,line是型別是列表的元素,既是字串

listfromline = line.split('\t') #以製表符對字串進行分割,將乙個字串分割成多個字串組成的列表

returnmat[index, : ] = listfromline[0:3] #將列表listfromline前3個資料,賦給returnmat第index行的,前2列

index+=1

return returnmat,classlabelvector #返回存放特徵的array陣列(元素以字串的型別存放),和存放類別的列表

由於各特徵值之間的差異比較大,需要歸一化,需要將每個點的三個特徵值轉化到(0,1)區間內:

def autonorm(dataset):  

minvals=dataset.min(0)

maxvals=dataset.max(0)

ranges= maxvals-minvals

normdataset=zeros(shape(dataset))

m=dataset.shape[0] #返回dataset第一維度的數目,既是行數

normdataset=dataset-tile(minvals,(m,1))

normdataset=normdataset/tile(range,(m,1))

return normdataset,ranges,minvals

一般用已有資料的90%作為訓練樣本,10%去測試分類器

def datingclasstest(): #測試**

horatio=0.10

datingdatamat,datinglabels=file2matrix('datingtestset.txt')

normsmat,ranges,minvals=autonorm(datingdatamat) #歸一化特徵矩陣

m=normsmat.shape[0]

numtestvecs=int(m*horatio) #用來測試的資料的數量numtestvecs

errorcount=0.0

for i in range(numtestvecs):

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

#資料的前numtestvecs行用來測試,後面的剩下的用來訓練

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

def classifyperson():

resultlist=['not at all','in small doses','in large doses']

percenttats=float(raw_input("percentage of time spent playing video games?"))

ffmiles=float(raw_input("frequent flier miles earned per year?"))

icecream=float(raw_input("liters of ice cream consumed per year?"))

datingdatamat,datinglabels=file2matrix('datingtestset2.txt')

normsmat,ranges,minvals=autonorm(datingdatamat)

inarr=array([ffmiles,percenttats,icecream])

classifierresult=classify0((inarr-minvals)/ranges,normsmat,datinglabels,3)

print "you will probably like this person:",resultlist[classifierresult-1]

《機器學習實戰》 K 近鄰演算法

基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...

機器學習實戰 K 近鄰演算法

簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...

機器學習實戰 k 近鄰演算法

本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...