- # - *-coding: cp936 - *-'''
- Created on Sep 16, 2010
- kNN: k Nearest Neighbors
- Input: inX: vector to compare to existing dataset (1xN)
- dataSet: size m data set of known vectors (NxM)
- labels: data set labels (1xM vector)
- k: number of neighbors to use for comparison (should be an odd number)
- Output: the most popular class label
- @author: pbharrin
- '''from numpy import * import operator from os import listdir#dataSet是矩阵,因为只有矩阵才有属性shape.#shape指的是矩阵有多少行多少列,属性返回为列表 (a, b),a代表的是行数,b代表的是列数#tile(a, (c, d))是一个函数,将列表a,拓展为c行,d列的矩阵。#a * *b是求a的b次幂#sum(axis = 0)是分别计算每一列的和#def classify0(inX, dataSet, labels, 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 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 file2matrix(filename) : fr = open(filename) numberOfLines = len(fr.readlines())#get the number of lines in the file returnMat = zeros((numberOfLines, 3))#prepare matrix to
- return classLabelVector = []#prepare labels
- return fr = open(filename) index = 0
- for line in fr.readlines() : line = line.strip() listFromLine = line.split('\t') returnMat[index, :] = listFromLine[0 : 3]#tmp = listFromLine[ - 1].strip()#print tmp classLabelVector.append(int((listFromLine[ - 1].strip()))) index += 1
- return returnMat,
- classLabelVector
- def autoNorm(dataSet) : 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))#element wise divide
- return normDataSet,
- ranges,
- minVals
- def datingClassTest() : hoRatio = 0.50#hold out 10 % datingDataMat,
- datingLabels = file2matrix('datingTestSet2.txt')#load data setfrom file 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)) print errorCount
- def img2vector(filename) : returnVect = zeros((1, 1024)) fr = open(filename) for i in range(32) : lineStr = fr.readline() for j in range(32) : returnVect[0, 32 * i + j] = int(lineStr[j]) return returnVect def handwritingClassTest() : hwLabels = [] trainingFileList = listdir('trainingDigits')#load the training set m = len(trainingFileList) trainingMat = zeros((m, 1024)) for i in range(m) : fileNameStr = trainingFileList[i] fileStr = fileNameStr.split('.')[0]#take off.txt classNumStr = int(fileStr.split('_')[0]) hwLabels.append(classNumStr) trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr) testFileList = listdir('testDigits')#iterate through the test set errorCount = 0.0 mTest = len(testFileList) for i in range(mTest) : fileNameStr = testFileList[i] fileStr = fileNameStr.split('.')[0]#take off.txt classNumStr = int(fileStr.split('_')[0]) vectorUnderTest = img2vector('testDigits/%s' % fileNameStr) classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3) print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr) if (classifierResult != classNumStr) : errorCount += 1.0 print "\nthe total number of errors is: %d" % errorCount print "\nthe total error rate is: %f" % (errorCount / float(mTest))
来源: http://lib.csdn.net/snippet/machinelearning/49564