演算法學習2 KNN 演算法

2021-07-10 01:13:13 字數 4063 閱讀 4350

昨天找到乙個資料分析的眾包**(kaggle),希望藉此來練習一下前段時間學習到的ml演算法。

今天就來回顧一下之前學習到的 knn 演算法,並用knn演算法進行手寫數字的識別。

knn演算法,即

k最近鄰(k-nearestneighbor)分類演算法,是最簡單的機器學習演算法之一,演算法思想很簡單:從訓練樣本集中選擇

k個

與測試樣本「

距離

」最近的樣本,這k個樣本中出現頻率最高的類別即作為測試樣本的類別。

優點:精度高、對異常值不敏感、無資料輸入假定

缺點:計算複雜度高、空間複雜度高

適用資料範圍:數值型、標稱型

k-近鄰演算法的一般步驟:

1.資料收集:可以使用任何方法

2.準本資料:距離計算所需要的數值,最好是結構化的資料格式

3.分析資料:可以使用任何方法

4.訓練演算法:此步驟不適用於k-近鄰演算法

5.測試演算法:計算錯誤率

6.使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-近鄰演算法判定輸入資料分別屬於哪一分類,最後應用對計算出的分類執行後續的處理

分類過程如下:

1.確定k值(k值是指對於乙個待分類的資料點,我們要尋找k個它的鄰居,即訓練樣品中與它距離最近的k個資料點)   k的取值一般不大於20(《機器學習實戰》)

2.根據事先確定的距離度量公式(如:歐式距離等),得到待分類資料點和所有訓練樣品(已知類別的樣品點)中距離最近的k個樣品

3.統計這k個樣品點中各個類別的數量。選取k個樣品點中所屬類別數量最多的類別作為待分類樣品點的類別。

本文**採用python 編寫,

knn演算法的核心函式:

classify0(inx,dataset,labels,k)

inx:待分類的資料點

dataset:所以訓練樣品的集合

labels:訓練樣品的類別集合

返回:待分類的資料點的k個鄰居類別最多的乙個類別

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

# """knn algorithm:

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

# 2. 按照距離遞增次序排序

# 3. 選取與當前點距離最小的k個點

# 4. 確定前k個點所在類別的出現頻率

# 5. 返回前k個點出現頻率最高的類別作為當前點的**分類"""

datasetsize = dataset.shape[0] #返回矩陣的行數和列數

diffmat = tile(inx ,(datasetsize,1))-dataset #tile :複製函式,返回乙個list

sqdiffmat = diffmat ** 2

sqdistances = sqdiffmat.sum(axis = 1)

distances = sqdistances **0.5

sorteddistindicies = distances.argsort()

classcount = {}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

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

return sortedclasscount[0][0]

獲取訓練用的資料:

gettraindata(filename)

filename

返回:訓練資料集合和訓練資料的類別集合

def gettraindata(filename):

"""獲取訓練用的資料 """

datas =

labels =

with open(filename,'rb') as myfile:

lines = csv.reader(myfile)

lines.next()

for line in lines:

data =

for n,num in enumerate(line):

for data in datas:

del data[0]

datas = array(datas)

print 'get traindata ok'

return datas,labels

獲取測試用的資料:

gettestdata(filename)

filename

返回:測試資料集合

def gettestdata(filename):

"""獲取測試用的資料"""

datas =

with open(filename,'rb') as myfile:

lines = csv.reader(myfile)

lines.next()

for line in lines:

data =

for n,num in enumerate(line):

datas = array(datas)

print 'get testdata ok'

return datas

用訓練資料進行演算法驗證:

testknn0(filename,trainrate,k)

filename

trainrate:取訓練資料中,進行訓練的資料量與所有訓練資料的比值

返回:按trianrate 的比例去**,knn演算法**與真實情況相比較的準確度。調整trainrate 會得到不同的準確度

def testknn0(filename,trainrate,k):

"""對knn演算法進行測試 從訓練資料中擷取一部分進行訓練,另一部分進行測試,檢測正確率"""

datalist,datalabels = gettraindata(filename)

# datalist = autpnorm(datalist)

count = len(datalist)

trainnum = int(count*trainrate)

traindata,trainlabels = datalist[0:int(trainnum)],datalabels[0:int(trainnum)]

testcorrectrate = 0.0

for i in range(trainnum,count):

idx = classify0(datalist[i],traindata,trainlabels,k)

print i - trainnum

if idx == datalabels[i]:

# print '**的類別為:'.decode('utf-8').encode('gbk'),idx,"實際類別為:".decode('utf-8').encode('gbk'),datalabels[i],'right'

testcorrectrate = testcorrectrate + 1

else:

pass

# print '**的類別為:'.decode('utf-8').encode('gbk'),idx,"實際類別為:".decode('utf-8').encode('gbk'),datalabels[i]

testcorrectrate = testcorrectrate/(count - trainnum )

return testcorrectrate

KNN演算法學習

knn演算法,我的理解是在有標籤的訓練樣本分佈中,有n個需要測試的樣本,通過尤拉距離 通過計算每個測試樣本得出離訓練最近的k個樣本,同過k個樣本中某一類標籤所佔的比例最高,則將該測試值 為該標籤。import numpy as np from math import sqrt from collec...

knn演算法學習

k近鄰近鄰演算法 多數表決規則等價於經驗風險最小化 損失函式最小化 一訓練資料為基礎,通過此類分類規則計算得到 一塊區域,有k個訓練資料,1,2,3個類別。1 2 3 當此區域判為1,損失函式等於2,3個數和 當此區域判為2,損失函式等於1,3個數和 當此區域判為3,損失函式為1,2個數和 選取損失...

統計學習方法學習筆記2 KNN

自程式設計實現 knn 演算法 def knn self data,dataset,label,k leth,dataset.shape dist key for i in range leth tmp np.sqrt np.sum np.square data dataset i dist key...