K近邻算法实例-约会问题

实例:改进约会网站的匹配效果

  • 案例描述:Hellen一直使用在线约会网站寻找适合自己的约会对象,尽管约会网站会推荐不同的人选,但是她并不喜欢每一个人。经过一番总结,她发现可以将约会过的人分为三种类型:
    • 不喜欢的人
    • 魅力一般的人
    • 极有魅力的人
  • 实验步骤
K近邻算法实例-约会问题_第1张图片
image.png

准备数据:从文本文件中解析数据

  • 把文本文件数据读入为矩阵数据
    • 步骤:
      • 得到文件行数
      • 创建返回的Numpy矩阵
      • 解析文件数据到列表
    • 代码:
# Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
# 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
# listFromLine[-1]:listFromLine的最后一个元素
# numpy的优势:NumPy是专门的数组语言,用其操作数组,可以省去很多循环语句,代码比使用Python列表简单得多。
# 从文本中解析数据
def file2matrix(filename):
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    # 一个二维数据
    returnMat = zeros((numberOfLines,3))
    classLabelVector =[]
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine
        classLabelVector.append(int(listFromLine[-1]))
        index = index + 1
    return returnMat,classLabelVector
  • 分析数据:画出各列数据的带标签散点图,观察不同列的分类效果
  • 归一化数值:由于各列数据之间的数量级差异较大,直接使用欧式定理进行距离计算时会导致较大的误差,因此为了减少误差可以进行简单的归一化操作,把数据压缩到[0,1]或者[-1,1]范围,公式:newvalue=(oldvalue-min)/(max-min)
    • 归一化原理和方法
    • 代码:
# 归一化数值
# tile(minvals,(m,1))建立并返回一个数组,重复minvals m行1列
def autoNorm(dataSet):
    minvals = dataSet.min(0)
    maxvals = dataSet.max(0)
    ranges = maxvals - minvals
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet- tile(minvals,(m,1))
    normDataSet = normDataSet/tile(ranges,(m,1))
    return normDataSet, ranges, minvals
  • 测试算法:测试分类器的效果
    • 代码:
# 测试算法:一个完整的程序验证分类器
# hoRatio:测试数据占总数据比例
def datingClassTest():
     hoRatio = 0.1
     datingDataMat, datingLabels = file2matrix('datingTestSet.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)
         print("the classfier came back with:"+ classifierResult+",the real answer is "+ datingLabels[i])
         if(classifierResult != datingLabels[i]):
             errorCount += 1.0
     print("error rate is ", errorCount/numTestVecs)

参考书籍:机器学习实战 Perer Harrington

你可能感兴趣的:(K近邻算法实例-约会问题)