《机器学习实战》学习笔记之k-近邻算法2

2.2 示例:使用k近邻算法改进约会网站的配对效果

2.2.1 从文本文件中解析数据

(1)import KNN,报错:for line in arrayOLines

原因:书中的代码在for语句最后漏掉了冒号,改成for line in arrayOLines:即可

(2)输出datingDataMat只有第一行有数值,其余全为0,如图



原因:由于空格不当,return写进for循环中,故只循环了一次就退出了

本节代码及注释

#coding=utf-8

from numpy import *

def file2matrix (filename):
    fr = open(filename)
    arrayOLines = fr.readlines()#读取所有行直到结束
    numberOfLines = len(arrayOLines)#返回元素个数
    returnMat = zeros((numberOfLines,3))#创建存储特征的矩阵
    classLabelVector = []#创建存储标签的向量
    index = 0
    for line in arrayOLines:
        line = line.strip()#strip移除字符串头尾的空白符,默认为\n \t \r ''
        listFromLine = line.split('\t')#split:通过指定分隔符对字符串进行分割,默认\n\t ''
        returnMat[index,:] = listFromLine[0:3]#取txt中每行前三个个元素存储到特征矩阵中
        classLabelVector.append(int (listFromLine[-1]))#append:在列表末尾添加新对象,取txt最后一列存储到标签中
        index +=1
return returnMat,classLabelVector

终端命令


2.2.2 使用Matplotlib创建散点图



想采用色彩标记不同的分类时,一直报错

报错:NameError: name 'array' is not defined

原因:需要导入array库



2.2.3归一化数值

def autoNorm(dataSet):
    minVals=dataSet.min(0)#(0)表示从列中取最小值,minVals尺寸为1*3
    maxVals=dataSet.max(0)#1*3
    ranges=maxVals-minVals#1*3
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[0]
    normDataSet=dataSet-tile(minVals,(m,1))#tile将1*3的最小值复制成m大小的矩阵
    normDataSet=normDataSet/tile(ranges,(m,1))
    return normDataSet,ranges,minVals


2.2.4测试算法

报错:


原因:这一句和下一句中的反斜杠\表示续行,在斜杠后换行,用\连接表示为一行。这句错误是因为用了\却没有换行

修改:可把\去掉,或在\之后换行

本节代码及注释:

def datingClassTest():
    hoRatio=0.10#选择10%的数据作为测试数据,90%的数据作为训练样本
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)#计算测试数据的元素个数
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)#数据前numTestVecs个作为测试向量,后面的向量作为训练向量,k=3
        print "the classifier came back with:%d,the real answer is:%d"%(classifierResult,datingLabels[i])
        if(classifierResult!=datingLabels[i]):errorCount+=1.0#若分类结果与实际标签不符,则错误数加1
    print "the total error rate is: %f" % (errorCount/float(numTestVecs))
终端窗口:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值