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

时间:2023-02-03 21:25:22

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

2.2.1 从文本文件中解析数据

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

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

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

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

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

原因:由于空格不当,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

终端命令

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

2.2.2 使用Matplotlib创建散点图

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

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

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

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

原因:需要导入array库

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

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

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
《机器学习实战》学习笔记之k-近邻算法2


2.2.4测试算法

报错:

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

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

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

本节代码及注释:

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))
终端窗口:

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