kNN.py

改进约会网站配对效果:

k-近邻算法

  1. def classify0(inX, dataSet, labels, k):
  2. dataSetSize = dataSet.shape[0]
  3. diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
  4. sqDiffMat = diffMat**2
  5. sqDistances = sqDiffMat.sum(axis=1)
  6. distances = sqDistances**0.5
  7. sortedDistIndicies = distances.argsort()
  8. classCount = {}
  9. for i in range(k):
  10. voteIlabel = labels[sortedDistIndicies[i]]
  11. classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
  12. sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
  13. return sortedClassCount[0][0]

Tile函数:

tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组

  1. >>> import numpy
  2. >>> numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1
  3. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  4. >>> numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1
  5. array([[0, 0]])
  6. >>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2
  7. array([[0, 0],
  8. [0, 0]])
  9. >>> numpy.tile([0,0],(3,1))
  10. array([[0, 0],
  11. [0, 0],
  12. [0, 0]])
  13. >>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1
  14. array([[0, 0, 0, 0, 0, 0]])
  15. >>> numpy.tile([0,0],(2,3))<span style="font-family: Arial, Helvetica, sans-serif;">#在列方向上重复[0,0]3次,行2次</span>
  16. array([[0, 0, 0, 0, 0, 0],
  17. [0, 0, 0, 0, 0, 0]])

python中的sum函数.sum(axis=1)

浅述python中argsort()函数的用法

operator模块提供的itemgetter函数主要用于获取某一对象 特定维度的数据,其中的参数为特定维度的序号,看下面的例子吧:

  1. >>> a=[1,2,3,4]
  2. >>> b=operator.itemgetter(1) #获取下标为1的元素
  3. >>> b(a)
  4. 2
  5. >>> b=operator.itemgetter(1,0) #获取下标为1和0的元素
  6. >>> b(a)
  7. (2,1)

python更改当前工作路径

将文本记录转为Numpy的解析程序:

  1. def file2matrix(filename):
  2. love_dictionary = {'largeDoses':3, 'smallDoses':2, 'didntLike':1}
  3. fr = open(filename)
  4. arrayOLines = fr.readlines()
  5. numberOfLines = len(arrayOLines) #get the number of lines in the file
  6. returnMat = np.zeros((numberOfLines, 3)) #prepare matrix to return
  7. classLabelVector = [] #prepare labels return
  8. index = 0
  9. for line in arrayOLines:
  10. line = line.strip()
  11. listFromLine = line.split('\t')
  12. returnMat[index, :] = listFromLine[0:3]
  13. if(listFromLine[-1].isdigit()):
  14. classLabelVector.append(int(listFromLine[-1]))
  15. else:
  16. classLabelVector.append(love_dictionary.get(listFromLine[-1]))
  17. index += 1
  18. return returnMat, classLabelVector

python numpy.zeros()函数的用法

在 Python 中字符串处理函数里有三个去空格(包括 ‘\n’, ‘\r’, ‘\t’, ’ ‘) 的函数:

  • strip 同时去掉左右两边的空格
  • lstrip 去掉左边的空格
  • rstrip 去掉右边的空格

matplotlib.pyplot中add_subplot方法参数111的含义

归一化特征值:

newValue = (oldValue - min)/(max - min)

  1. def autoNorm(dataSet):
  2. minVals = dataSet.min(0)
  3. maxVals = dataSet.max(0)
  4. ranges = maxVals - minVals
  5. normDataSet = np.zeros(np.shape(dataSet))
  6. m = dataSet.shape[0]
  7. normDataSet = dataSet - np.tile(minVals, (m, 1))
  8. normDataSet = normDataSet/np.tile(ranges, (m, 1)) #element wise divide
  9. return normDataSet, ranges, minVals

分类器针对约会网站的测试代码:

  1. def datingClassTest():
  2. hoRatio = 0.50 #hold out 10%
  3. datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
  4. normMat, ranges, minVals = autoNorm(datingDataMat)
  5. m = normMat.shape[0]
  6. numTestVecs = int(m*hoRatio)
  7. errorCount = 0.0
  8. for i in range(numTestVecs):
  9. classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
  10. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
  11. if (classifierResult != datingLabels[i]): errorCount += 1.0
  12. print("the total error rate is: %f" % (errorCount / float(numTestVecs)))
  13. print(errorCount)

image.png

约会网站预测函数:

  1. def classifyPerson():
  2. resultList = ['not at all', 'in small doses', 'in large doses']
  3. percentTats = float(input(\
  4. "percentage of time spent playing video games?"))
  5. ffMiles = float(input("frequent flier miles earned per year?"))
  6. iceCream = float(input("liters of ice cream consumed per year?"))
  7. datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
  8. normMat, ranges, minVals = autoNorm(datingDataMat)
  9. inArr = np.array([ffMiles, percentTats, iceCream, ])
  10. classifierResult = classify0((inArr - \
  11. minVals)/ranges, normMat, datingLabels, 3)
  12. print("You will probably like this person: %s" % resultList[classifierResult - 1])

image.png

手写识别系统:

  1. def img2vector(filename):
  2. returnVect = np.zeros((1, 1024))
  3. fr = open(filename)
  4. for i in range(32):
  5. lineStr = fr.readline()
  6. for j in range(32):
  7. returnVect[0, 32*i+j] = int(lineStr[j])
  8. return returnVect

自包含函数?

手写数字识别系统的测试代码:

  1. def handwritingClassTest():
  2. hwLabels = []
  3. trainingFileList = listdir('trainingDigits') #load the training set
  4. m = len(trainingFileList)
  5. trainingMat = np.zeros((m, 1024))
  6. for i in range(m):
  7. fileNameStr = trainingFileList[i]
  8. fileStr = fileNameStr.split('.')[0] #take off .txt
  9. classNumStr = int(fileStr.split('_')[0])
  10. hwLabels.append(classNumStr)
  11. trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)
  12. testFileList = listdir('testDigits') #iterate through the test set
  13. errorCount = 0.0
  14. mTest = len(testFileList)
  15. for i in range(mTest):
  16. fileNameStr = testFileList[i]
  17. fileStr = fileNameStr.split('.')[0] #take off .txt
  18. classNumStr = int(fileStr.split('_')[0])
  19. vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
  20. classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
  21. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))
  22. if (classifierResult != classNumStr): errorCount += 1.0
  23. print("\nthe total number of errors is: %d" % errorCount)
  24. print("\nthe total error rate is: %f" % (errorCount/float(mTest)))

image.png