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

该博客详细介绍了如何使用Python实现K-近邻(K-Nearest Neighbor, KNN)算法,包括从文件中读取数据、数据预处理、KNN分类方法以及测试算法的错误率。内容涵盖数据集的读取、数据归一化、KNN分类器的实现以及错误率计算等关键步骤。" 111670204,10295476,UG CAM教程:型腔铣Cavity_Mill的参考刀具与重叠距离解析,"['CAM编程', 'UG CAM', '模具设计', '机械加工', '数控编程']
摘要由CSDN通过智能技术生成
'''
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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值