kNN算法改进约会网站的配对效果
2016-01-15 15:59
766 查看
#coding = utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as plt def createDataset(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) #生成一个数组 labels = ['A', 'A', 'B', 'B']#标签向量 return group, labels def classify0(inX, dataSet, labels, k): #分别为待分类向量,数据集,标签向量,k dataSetSize = dataSet.shape[0] #计算数据集行数 diffMat = tile(inX, (dataSetSize, 1)) - dataSet sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis = 1) distances = sqDistances ** 0.5 #计算待分类向量和数据集每个向量的距离 sortedDistIndicies = distances.argsort() #排序且返回的是升序元素的索引 classCount = {} #创建空字典 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #记录不同类别的分别有几个 sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True) #按照键值对的第二维降序排 return sortedClassCount[0][0] #分类结果 def file2matrix(filename): fr = open(filename) arrayOLines = 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 group, labels = createDataset() sortedClassCount = classify0([0, 0], group, labels, 3) returnMat, classLabelVector = file2matrix('datingTestSet2.txt') fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(returnMat[:,1], returnMat[:,2], 15.0*array(classLabelVector), 15.0*array(classLabelVector)) def autoNorm(dataSet): #归一化特征值new = (old - min)/(max - min) 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 normDataSet, ranges, minVals = autoNorm(returnMat) def datingClassTest(): #测试分类器错误率 hoRatio = 0.10 #使用%10的数据进行测试即可 datingDataMat, datingLabels = file2matrix('datingTestSet2.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 classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) if(classifierResult != datingLabels[i]): errorCount += 1.0 print "the total error rate is: %f" % (errorCount/float(numTestVecs)) datingClassTest()
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- C#检测DataSet是否为空的方法
- C#通过DataSet读写xml文件的方法
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析