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'))
《机器学习实战》使用K-近邻算法改进约会网站的配对结果
猜你喜欢
转载自blog.csdn.net/niuxiaolei/article/details/80487195
今日推荐
周排行