K近邻算法实例-约会问题
2019-03-03 本文已影响0人
CSTDOG
实例:改进约会网站的匹配效果
-
案例描述:Hellen一直使用在线约会网站寻找适合自己的约会对象,尽管约会网站会推荐不同的人选,但是她并不喜欢每一个人。经过一番总结,她发现可以将约会过的人分为三种类型:
- 不喜欢的人
- 魅力一般的人
- 极有魅力的人
- 实验步骤:
准备数据:从文本文件中解析数据
-
把文本文件数据读入为矩阵数据
-
步骤:
- 得到文件行数
- 创建返回的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