2.2实例:使用k-近邻算法改进约会网站的配对效果
2.2.1准备数据:从文本文件中解析数据
将文本记录到转换Numpy的解析程序
def filezmatrix(filename):
fr = open(filename)
arrayOfLines = fr.readlines()
numberOfLines = len(arrayOLines)
returnMat = zeros((numberOfLines,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]))
index += 1
return returnMat,classLabelVector
从上面的代码可以看到,python处理文本文件非常容易。首先我们需要知道文本文件有多少行。打开文件,得到文件的行数。然后创建以零填充的矩阵Numpy。为简化处理,将该矩阵的另一维度设置为固定值3,可以根据实际需求增加相应的代码以适应变化的输入值。循环处理文件中的每行数据,首先使用函数line.strip()截取所有的回车字符,然后使用tab字符\t将上一步得到的整行数据分割成一个元素列表。接着,我们选取前三个元素,将他们存储到特征矩阵中。
注意:必须明确的通知解释器,列表中存储的元素为整型,否则python会将这些元素作为字符串处理。
2.2.2分析数据:使用matplotlib创建散点图
2.2.3准备数据:归一化数值
处理不同取值范围的特征值,将数值归一化,如将取值范围处理为0到1或者-1到1之间。
下面的公式可以将任意取值范围的特征值转化为0到1区间内的值:
newValue = (oldValue-min)/(max-min)
其中min和max分别为数据集中的最小特征值和最大特征值。
虽然改变取值范围增加了分类器的复杂度,但是为了得到准确结果,必须注这样做。
2.2.4测试算法:作为完整程序验证分类器
分类器针对约会网站的测试代码
def datingClassTest():
hoRatio = 0:10
datingDataMat,datingLabels = file2matrix('datingTestSet.txt')
normMat =,ranges,minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestvecs = int(m*hoRtio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classif0(normMat[i,:],normMat[numTestVecs:m,:],\datingLabels[numTestVecs:m],3)
print "the classifier came back with:%d,the real answer is:%d"\%(classifierResult,datingLabels[i])
if(classifierReslut != datingLabels[i]:errorCount += 1.0 print "the total error rate is:%f" % (errorCount/float(numTestVecs))
使用file2matrix和autoNorm()函数从文件中读取数据并将其用于测试,哪些数据用于分类器的训练样本;然后将这两部分数据输入到原始kNN分类器函数classif0.最后,函数计算错误率并输出结果。
注意:得到可靠的数据同样重要。
2.25使用算法:构建完整可用系统
约会网站预测函数
def classifyPerson():
resultList = ['not at all','in small doses','in large doses']
percentTats = float(raw_input(\"percentage of time spent playing video games?"))
ffMiles = float(raw_input("frequent flier miles earned per year?"))
iceCream = float(raw_input("liters of lic cream consumed per years?))
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
normMat,ranges,minVals = autoNorm(datingDataMat)
inArr = array([ffMiles,percentTats,icCream])
classifierResult = classify0((inArr-\minVals)/ranges,normMat,datingLabels,3)
print "You will probably like this person:",\resultList[classifierResult - 1]
raw_input函数允许用户输入文本行命令并返回用户所输入的命令。