机器学习实战训练营-第2章-k-近邻算法-2.2实例:使用k-近邻算法改进约会网站的配对效果

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函数允许用户输入文本行命令并返回用户所输入的命令。

猜你喜欢

转载自blog.csdn.net/qq_44621510/article/details/89978020