機器學習 K 近鄰演算法的Python實現

2021-06-28 12:06:47 字數 2938 閱讀 7541

'''

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 歐氏...