机器学习

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

2019-03-03  本文已影响0人  CSTDOG

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

image.png

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

# 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
# 归一化数值
# 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

上一篇 下一篇

猜你喜欢

热点阅读