'''
created on jan 27, 2015
@author: 史帥
'''from numpy import *
import operator
import re
def filetodataset(filename,n):
'''此方法功能是從檔案中讀取樣本集資料,樣本資料的格式為:資料以空白字元分割,最後一列為正整數型的類標籤
引數:filename:存放樣本集資料的檔案路徑
n:取每條資料的前n個特徵值作為分類的特徵值
返回值:
dataset:樣本集資料組成的二維陣列
labels:樣本集資料對應的類標籤
'''file=open(filename, mode='r')
lines=file.readlines()
lineslen=len(lines)
dataset=zeros((lineslen,n))
labels=
index=0
p=re.compile(r"\s+")
for line in lines:
line=p.split(line.strip())
dataset[index,:]=line[0:n]
index+=1
return dataset,labels
def formatdataset(dataset):
'''此方法功能是歸一化樣本集資料,將每一項特徵值歸一化為0~1之間的浮點數
引數:dataset:樣本集資料組成的二維陣列
返回值:
formatdataset:歸一化之後的樣本集資料組成的二維陣列
ranges:特徵值最大值與最小值的差組成的一維陣列
mins:最小特徵值組成的一維陣列
'''mins=dataset.min(axis=0)
maxs=dataset.max(axis=0)
ranges=maxs-mins
len=dataset.shape[0]
formatdataset=zeros(shape(dataset))
formatdataset=dataset-tile(mins,(len,1))
formatdataset=formatdataset/tile(ranges,(len,1))
return formatdataset,ranges,mins
def classify(inx,dataset,labelvalues,k,labels):
'''此方法是k-近鄰演算法的主演算法,功能是對待分類資料進行分類
引數:inx:歸一化後的待分類資料,與樣本集資料格式一致
dataset:歸一化後的樣本集資料組成的二維陣列
labelvalues:樣本集資料的正整數型類標籤
k:樣本集資料中與待分類資料的距離最相近的前k條資料,k一般不大於20
labels:樣本集資料中類標籤從小到大依次代表的實際類別組成的一維陣列
返回值:
inxclass:待分類資料的實際類別
'''datasetsize=dataset.shape[0]
inxdataset=tile(inx,(datasetsize,1))-dataset
inxdataset=inxdataset**2
inxdataset=inxdataset.sum(axis=1)
inxdataset=inxdataset**0.5
inxdatasetindex=inxdataset.argsort()
classcount={}
for i in range(k):
votelabel=labelvalues[inxdatasetindex[i]]
classcount[votelabel]=classcount.get(votelabel,0)+1
sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)
inxclass=labels[sortedclasscount[0][0]-1]
return inxclass
def classifytest(filename,n,k,testrate=0.1):
'''此方法功能是測試k-近鄰演算法的錯誤率
引數:filename:存放樣本集資料的檔案路徑
n:取每條資料的前n個特徵值作為分類的特徵值
k:樣本集資料中與待分類資料的距離最相近的前k條資料,k一般不大於20
testrate:資料集中作為測試資料佔的比例,真實的樣本集資料的比例為1-testrate.預設值為0.1
返回值:
k-近鄰演算法的錯誤率,返回值型別為float
'''dataset,labelvalues=filetodataset(filename,n)
len=dataset.shape[0]
testlen=int(len*testrate)
testdataset=dataset[0:testlen]
dataset,ranges,mins=formatdataset(dataset[testlen:])
errorcount=0
for i in range(int(testlen)):
if labelvalues[i]!=classify((testdataset[i]-mins)/ranges,dataset,labelvalues[testlen:],k):
errorcount+=1
print("錯誤數:".format(errorcount))
print("錯誤率為:".format(errorcount/float(testlen)))
return errorcount/float(testlen)
機器學習 k 近鄰演算法
一.k 近鄰演算法概述 簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將資料的每個特徵與樣本集合中資...
機器學習 K近鄰演算法
用例一 from sklearn.neighbors import nearestneighbors import numpy as np x np.array 1,1 2,1 3,2 1,1 2,1 3,2 nbrs nearestneighbors n neighbors 2,algorithm...
機器學習 K近鄰演算法
工作原理 存在乙個訓練樣本資料集合,每組資料對應乙個標籤及分類 比如下邊例子為前兩個資料都為a類 輸入測試樣本後通過計算求出測試樣本與訓練樣本的歐氏距離d,取前k個最小的值,這k組資料對應的標籤分類最多的那種,就是測試樣本的標籤。訓練樣本資料 1.0,1.1 1.0,1.0 0,0 0,0.1 歐氏...