K-近邻算法的一个简单例子(二)

接着上一个例子进行拓展,file2matrix()函数将文档中的数据转化为内存中的矩阵(数组),autoNorm()将三列数据归一化,这里要注意这里使用的归一化方法对于极值点非常敏感,可以考虑其他的方法。datingClassTest()调用KNN中的classify0函数对数据集进行逐个进行
分类,这里K取3.hoRatio=0.10划定了训练集和检验集,但要想实现更好的效果,对于划定训练集和检验集需要十分慎重,使用随机抽取等方法
from  numpy import  *
import  matplotlib.pyplot as pyt
import KNN
def file2matrix(filename):
    fr=open(filename)
    arrayOLines=fr.readlines()                                #注意和read()、readline()的区别
    numberOfLines=len(arrayOLines)
    returnMat=zeros((numberOfLines,3))
    classLabelVector=[]
    index=0
    for line in arrayOLines:
        line=line.strip()
        listFromLine=line.split('\t')
        returnMat[index,:]=listFromLine[0:3]                  #这里 returnMat[index,:],意思是指index行进行[:]
        classLabelVector.append(listFromLine[-1])
        index+=1
    return returnMat,classLabelVector
def autoNorm(dataSet):
    minVals=dataSet.min(0)                                    #numpy中min()没有参数时,返回所有中最小的,0每列最小,1每行最小
    maxVals=dataSet.max(0)
    ranges=maxVals-minVals
    normDataset=zeros(shape(dataSet))
    m=dataSet.shape[0]                                        #dataSet的行数
    normDataset=dataSet-tile(minVals,(m,1))
    # jk=tile(range,(m,1))
    normDataset=normDataset/tile(ranges,(m,1))
    return normDataset
def datingClassTest():
    hoRatio=0.10                                              #测试数据所占的比例
    datingDataMat,datingDataLabel=file2matrix('E:\datingTestSet.txt')
    normMat=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    erroCount=0.0
    for i in range(numTestVecs):
        classifierResult=KNN.classify0(normMat[i,:],normMat[numTestVecs:m,:],datingDataLabel[numTestVecs:m],3)
        print('the classifier came back with: %s,the real answer is : %s '%(classifierResult,datingDataLabel[i]))
        if (classifierResult!=datingDataLabel[i]): erroCount+=1.0
    print('the total error rate is : %f'%(erroCount/float(numTestVecs)))
datingClassTest()

运行结果:

the classifier came back with: 1,the real answer is : 1 

..............此处省略998行

the classifier came back with: 2,the real answer is : 2 
the total error rate is : 0.080000

错误率8%,还不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值