使用k-近邻算法改进约会网站的配对效果

有关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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值