有关k-近邻的理论知识以及算法实现,可查看上一篇博文k-近邻
此文以一个实际例子:使用k-近邻算法改进约会网站的配对效果。
在约会网站上使用k-近邻算法:
1、收集数据:提供文本文件
2、准备数据:使用python解析文本文件
3、测试算法:将数据集分为训练数据和测试数据。用训练数据训练分类器,用测试数据集评估分类器。
4、使用算法:输入一些特征数据来判断是否是自己想要的结果。
使用k-近邻算法改进约会网站的配对效果
数据存放在文本文件datingTestSet2.txt中,每一个样本数据占一行,总共有1000行。样本主要有三个特征。
将特征数据输入到分类器之前,必须将待处理数据的格式变为分类器可接受的格式。故在kNN.py文件中创建名为file2matrix函数,用来处理输入格式问题。该函数的输入:文件名字符串;输出:训练样本矩阵和类标签向量
一、准备数据:从文本文件中解析数据,处理文件格式
def file2matrix(filename):
###1、得到文件行数
fr = open(filename) ###打开文件
arrayOLines = fr.readlines() ###readlines()用于读取所有行,并返回包含行的列表
numberOfLines = len(arrayOLines) ###读取文件的行数
###2、创建返回的NumPy矩阵
returnMat = zeros((numberOfLines, 3)) ### 创建以0填充的矩阵,且与特征数据集匹配,训练样本矩阵。
###3、解析文件数据到列表
classLabelVector = []#类标签向量
index = 0
for line in arrayOLines:
line = line.strip() ###删除空白符,这里截取掉所有回车字符
listFromLine = line.split('\t') ###对于每一行,按照制表符切割字符串,将上一步得到的整行数据分割成一个元素列表。
returnMat[index, :] = listFromLine[0:3] ###选取前三个元素,将它们存储到特征矩阵中。
classLabelVector.append(int(listFromLine[-1])) ###将列表的最后一列存储到类别标签向量中。int是告诉解释器,列表中存储的元素值为整型。
index += 1
return returnMat, classLabelVector#返回的是训练样本矩阵和类标签向量。
在命令提示符下输入命令:
import kNN
>>> datingDataMat, datingLabels=kNN.file2matrix('/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/datingTestSet2.txt')
>>> datingDataMat
>>> datingLabels
补充:
**1.**read()函数
read(size):
从文件当前位置起读取size个字节(如果文件结束,就读取到文件结束为止),如果size是负值或省略,读取到文件结束为止,返回结果是一个字符串。
readline():
readline()每次读取一行,当前位置移到下一行
readlines():
读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素读取文本所有内容,一般配合for
in使用。2.
strip()
函数
声明: s为字符串,rm为要删除的字符序列s.strip(rm)
删除s字符串中开头、结尾处,位于 rm删除序列的字符s.lstrip(rm)
删除s字符串中开头处,位于 rm删除序列的字符s.rstrip(rm)
删除s字符串中结尾处,位于
rm删除序列的字符
当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ‘)
这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
3.
s.split('\t')
s为字符串 对于每一行,按照制表符切割字符串,将上一步得到的整行数据分割成一个元素列表。详情可参考:
http://blog.csdn.net/Holyang_1013197377/article/details/49205065
二、准备数据:归一化数值
回到那个数据集,第一列代表的特征数值远远大于其他两项特征,这样在求距离时,这个特征就会占很大的比重,使两点的距离很大程度上取决于这个特征,这当然是不公平的,如果我们认为三种特征都同等地重要,我们就需要三个特征都均平地决定距离,所以我们要对数据进行处理,希望处理之后既不影响相对大小又可以不失公平。
常采用的方法是:归一化:将取值范围处理为0到1或者-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1区间内:
n