机器学习入门:K-近邻算法

"action"] return group, labels
>>> import kNN>>> group, labels = kNN.createDataSet()>>> kNN.classify0([18, 90], group, labels, 3)'love'

我们看到预测结果为爱情片。这是一个简单的分类器,当然,我们应该通过大量的测试,看预测结果与预期结果是否相同,进而得出错误率,完美的分类器错误率为0,最差的错误率为1,上边电影分类的例子已经可以使用了,但是貌似没有太大的作用,下边我们来看一个生活中的实例,使用k-近邻算法改进约会网站的效果,然后使用k-近邻算法改进手写识别系统。

改进约会网站的配对效果

有个姑娘,一直在使用某交友网站,但是推荐来的人总是不尽人意,她总结了一番,曾交往过3中类型的人:

  • 不喜欢的人
  • 魅力一般的人
  • 极具魅力的人

她觉得自己可以在周一~周五约会那些魅力一般的人,周末与那些极具魅力的人约会,因为她希望我们可以更好的帮助她将匹配的对象划分到确切的分类中,她还收集了一些约会网站未曾记录过的数据信息,她认为这些数据信息会有帮助。这些数据存放在代码文件夹下datingTestSet2.txt中,总共有1000行数据(妹的约了1000个人),主要包含以下特征:

  • 每年获得的飞行常客里程数
  • 玩视频游戏所消耗的时间百分比
  • 每周消费的冰激凌公升数

我们看到,统计的东西都比较奇葩,我们先从文件中把这些数值解析出来,输出训练样本矩阵和分类标签向量。在kNN.py中继续书写代码:

  • 从文本中读入数据
def file2matrix(filename) :    fr = open(filename)    arrayOfLines = fr.readlines()    numberOfLines = len(arrayOfLines) # 得到文件行数    returnMat = zeros((numberOfLines, 3)) # 创建用0填充的矩阵,这里为了简化处理,我们将矩阵的另一个纬度设置为3,可以按照自己的需求增加数量。    classLabelVector = []    index = 0    # 解析文件    for line in arrayOfLines :         line = line.strip() # 截取掉所有的回车字符        listFromLine = line.split('\t')        returnMat[index, :] = listFromLine[0: 3] # range        classLabelVector.append(int(listFromLine[-1]))        index += 1    return returnMat, classLabelVector
>>> import kNN>>> mat, vector = kNN.file2matrix('datingTestSet2.txt')>>> mat, vector = kNN.file2matrix('datingTestSet2.txt')>>> matarray([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],       [  1.44880000e+04,   7.15346900e+00