昨天找到乙個資料分析的眾包**(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...