【机器学习】K-近邻算法的Python实现

来源:互联网 发布:linux命令行调整音量 编辑:程序博客网 时间:2024/05/18 01:00
'''Created on Jan 27, 2015@author: 史帅'''from numpy import *import operatorimport redef 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,labelsdef 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,minsdef 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)

0 0
原创粉丝点击