'''
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]
labels.append(int(line[-1]))
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("错误数:{0}".format(errorCount))
print("错误率为:{0}".format(errorCount/float(testLen)))
return errorCount/float(testLen)
【机器学习】K-近邻算法的Python实现
最新推荐文章于 2024-02-17 10:39:44 发布
该博客详细介绍了如何使用Python实现K-近邻(K-Nearest Neighbor, KNN)算法,包括从文件中读取数据、数据预处理、KNN分类方法以及测试算法的错误率。内容涵盖数据集的读取、数据归一化、KNN分类器的实现以及错误率计算等关键步骤。"
111670204,10295476,UG CAM教程:型腔铣Cavity_Mill的参考刀具与重叠距离解析,"['CAM编程', 'UG CAM', '模具设计', '机械加工', '数控编程']
摘要由CSDN通过智能技术生成