《机器学习实战》使用K-近邻算法改进约会网站的配对结果

import numpy as np
#(1)收集数据:提供文本文件

#(2)准备数据:使用python解析文本文件
def file2matrix(filename):
   fr = open(filename,'r')
   arrayOLines = fr.readlines() #结果为列表形式
   numberOfLines = len(arrayOLines)
   returnMat = np.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 # 0行 1行 2行 以此类推
   return returnMat,classLabelVector
datingDataMat,datingLabels = file2matrix('E:/代码/机器学习实战/第二章:K-近邻算法/使用k-近邻算法改进约会网站的配对效果/datingTestSet2.txt')
#准备数据:归一化处理  newValue = (oldValue - min)/(max - min)
def autoNorm(dataSet):
   minVals = dataSet.min(0)
   maxVals = dataSet.max(0)
   ranges = maxVals - minVals
   normDataSet = np.zeros(dataSet.shape)
   m = dataSet.shape[0]
   normDataSet = dataSet - np.tile(minVals,(m,1)) #分子
   normDataSet = normDataSet / np.tile(ranges,(m,1)) #分母
   return normDataSet, ranges, minVals
normMat, ranges, minVals = autoNorm(datingDataMat)
print(normMat, ranges, minVals)
#(3)分析数据:使用Matplotlib画二维扩散图
import matplotlib.pyplot as plt 
fig = plt.figure()  #创建一个没有坐标轴的空图像 Axes()
ax = fig.add_subplot(111) #在一张figu里面生成多张子图,参数1是子图总行数 参数2是子图总列数 参数3是子图位置
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15.0*np.array(datingLabels)) #散点图 亮度设置
plt.show() #显示figure

#(4)训练数据:此步骤不适合k-近邻算法
#(5)测试算法:使用海伦提供的部分数据作为测试样本。测试样本与非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误
import KNN
def datingClassTest():
   hoRatio = 0.10
   datingDataMat,datingLabels = file2matrix('E:/代码/机器学习实战/第二章:K-近邻算法/使用k-近邻算法改进约会网站的配对效果/datingTestSet2.txt')
   normMat, ranges, minVals = autoNorm(datingDataMat)
   m = normMat.shape[0]
   numTestVecs = int(m*hoRatio)
   errorCount = 0.0
   for i in range(numTestVecs):
      classifierResult = KNN.classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
      print('the classifier came back with: %d, the real answer answer is %d'%(classifierResult,datingLabels[i]))
      if classifierResult != datingLabels[i]:
         errorCount += 1.0
   print('the total error rate is %f' %(errorCount/float(numTestVecs)))
datingClassTest()
#(6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型
#约会网站预测函数
def classifyPerson():
   resultList = ['not at all','in small doses','in large doses']
   percentTats = float(input("percenttage of time spent playing video games?"))
   ffMiles = float(input("frequent flier miles earned per year?"))
   iceCream = float(input("liters of ice cream consumed per year?"))
   datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
   normMat, ranges, minVals = autoNorm(datingDataMat)
   inArr = np.array([ffMiles,percentTats,iceCream])
   classifierResult = KNN.classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
   print("You will probably like this perpon: ",resultList[classifierResult - 1])
classifyPerson()

# print(file2matrix('datingTestSet2.txt'))

猜你喜欢

转载自blog.csdn.net/niuxiaolei/article/details/80487195
今日推荐