本文代码均来自《机器学习实战》

这里讲了两个例子,datingclass 和 figureclass,用到的都是KNN,要调用这两个例子的话就在代码末尾加datingClassTest()handwritingClassTest()

至于第二个例子中用到的图片,是指那种字符点阵的图片,但是对于同样的原理,灰度图片应该也是可以的,虽然准确率就不一定了吧

图片长这个样子:

0_0.txt

00000000000001111000000000000000

00000000000011111110000000000000

00000000001111111111000000000000

00000001111111111111100000000000

00000001111111011111100000000000

00000011111110000011110000000000

00000011111110000000111000000000

00000011111110000000111100000000

00000011111110000000011100000000

00000011111110000000011100000000

00000011111100000000011110000000

00000011111100000000001110000000

00000011111100000000001110000000

00000001111110000000000111000000

00000001111110000000000111000000

00000001111110000000000111000000

00000001111110000000000111000000

00000011111110000000001111000000

00000011110110000000001111000000

00000011110000000000011110000000

00000001111000000000001111000000

00000001111000000000011111000000

00000001111000000000111110000000

00000001111000000001111100000000

00000000111000000111111000000000

00000000111100011111110000000000

00000000111111111111110000000000

00000000011111111111110000000000

00000000011111111111100000000000

00000000001111111110000000000000

00000000000111110000000000000000

00000000000011000000000000000000

  1. '''
  2. Created on Sep 16, 2010
  3. kNN: k Nearest Neighbors
  4. Input: inX: vector to compare to existing dataset (1xN)
  5. dataSet: size m data set of known vectors (NxM)
  6. labels: data set labels (1xM vector)
  7. k: number of neighbors to use for comparison (should be an odd number)
  8. Output: the most popular class label
  9. @author: pbharrin
  10. '''
  11. from numpy import *
  12. #NumPy是Python语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
  13. import pdb
  14. pdb.set_trace()#用于调试
  15. import operator#operator 模块是 Python 中内置的操作符函数接口,它定义了算术,比较和与标准对象 API 相对应的其他操作的内置函数。
  16. #operator 模块是用 C 实现的,所以执行速度比 Python 代码快。
  17. from os import listdir#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。
  18. def classify0(inX, dataSet, labels, k):
  19. #这个方法每次只能处理一个样本
  20. #这里的dataSet是一个数组,inX是待分类的样本,K是neighbor的数量
  21. #inX是以行向量的方式储存的,dataSet也是一行表示一个样本
  22. #KNN算法几乎不需要“训练”,属于即开即用那种的
  23. dataSetSize = dataSet.shape[0]#这是样本个数
  24. diffMat = tile(inX, (dataSetSize,1)) - dataSet#ile()函数内括号中的参数代表扩展后的维度,而扩展是通过复制A来运作的,最终得到一个与括号内的参数(reps)维度一致的数组(矩阵)
  25. #将inX复制为和样本一样多的行数
  26. sqDiffMat = diffMat**2
  27. sqDistances = sqDiffMat.sum(axis=1)#sumarray求和,如果参数是0,就按列求和,返回一个行向量;如果参数是1,就按行求和,但是也返回一个行向量(从计算的角度来看,是列向量转置之后的)
  28. distances = sqDistances**0.5#**是python中的幂运算,用在矩阵上的效果的对应位置相乘而不是矩阵乘法中的A*A
  29. ##现在distances中的每一个元素代表了待求目标点和每一个样本点之间的距离
  30. sortedDistIndicies = distances.argsort() #argsort是numpy的方法,从小到大排序(不加参数的话),返回的是index而不是排序后的元素本身
  31. classCount={}#这是个字典类型
  32. for i in range(k):
  33. voteIlabel = labels[sortedDistIndicies[i]]
  34. classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#给这个类型加一
  35. sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)#选出k中数量最大的label
  36. return sortedClassCount[0][0]##输出最大的label
  37. def createDataSet():
  38. group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
  39. #[[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]是list类型的二维向量,转成array可以方便进行向量化计算(array是numpy封装的)
  40. labels = ['A','A','B','B']
  41. return group, labels
  42. def file2matrix(filename):#将文件数据(data,label)转换为矩阵
  43. fr = open(filename)
  44. numberOfLines = len(fr.readlines()) #get the number of lines (行数)in the file
  45. returnMat = zeros((numberOfLines,3)) #prepare matrix to return,这里将矩阵的列数硬编码为3了,需要的时候可以改
  46. classLabelVector = [] #prepare labels return
  47. index = 0
  48. fr = open(filename)#为啥这里要再读一次呢?因为上面的fr.readlines()为了获取数据行数已经把全文读完了
  49. for line in fr.readlines():
  50. line = line.strip()#移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
  51. listFromLine = line.split('\t')
  52. returnMat[index,:] = listFromLine[0:3]
  53. classLabelVector.append(int(listFromLine[-1]))
  54. index += 1
  55. return returnMat,classLabelVector
  56. def autoNorm(dataSet):#归一化,使用公式为 newValue=(oldValue-min)/(max-min)
  57. minVals = dataSet.min(0)
  58. maxVals = dataSet.max(0)
  59. ranges = maxVals - minVals
  60. normDataSet = zeros(shape(dataSet))
  61. m = dataSet.shape[0]
  62. normDataSet = dataSet - tile(minVals, (m,1))
  63. normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
  64. return normDataSet, ranges, minVals
  65. #第一个KNN例子,classify date
  66. def datingClassTest():
  67. hoRatio = 0.50 #hold out 10%
  68. datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
  69. normMat, ranges, minVals = autoNorm(datingDataMat)
  70. m = normMat.shape[0]
  71. numTestVecs = int(m*hoRatio)
  72. errorCount = 0.0
  73. for i in range(numTestVecs):
  74. classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
  75. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
  76. if (classifierResult != datingLabels[i]): errorCount += 1.0
  77. print("the total error rate is: %f" % (errorCount/float(numTestVecs)))
  78. print(errorCount)
  79. def img2vector(filename):
  80. #将路径中文件转换为行向量进行存储,说到底干的就是一个char转int的活,
  81. returnVect = zeros((1,1024))#行向量,这里不好的一点就是特征数也是写死的,要实现泛用需要修改
  82. fr = open(filename)
  83. for i in range(32):
  84. lineStr = fr.readline()#读一行
  85. for j in range(32):
  86. returnVect[0,32*i+j] = int(lineStr[j])
  87. return returnVect
  88. #第二个例子,归类由字符串组成的数字
  89. def handwritingClassTest():
  90. hwLabels = []#存储所有样本的label
  91. trainingFileList = listdir('trainingDigits') #load the training set,返回的是一个字符串数组,里面是该文件夹中所有文件的名称
  92. print(trainingFileList)
  93. m = len(trainingFileList)#m代表训练集样本个数
  94. trainingMat = zeros((m,1024))#1024是特征个数
  95. for i in range(m):
  96. fileNameStr = trainingFileList[i]
  97. fileStr = fileNameStr.split('.')[0] #take off .txt
  98. classNumStr = int(fileStr.split('_')[0])
  99. #为什么要分这个?因为这里的样本比较特殊,文件名的第一个数组就代表了label
  100. hwLabels.append(classNumStr)
  101. trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)#将路径输入,返回转换好的矩阵
  102. testFileList = listdir('testDigits') #iterate through the test set
  103. errorCount = 0.0
  104. mTest = len(testFileList)
  105. for i in range(mTest):#对验证集一个一个进行运算,虽然这种for比较慢吧`````
  106. fileNameStr = testFileList[i]
  107. fileStr = fileNameStr.split('.')[0] #take off .txt
  108. classNumStr = int(fileStr.split('_')[0])
  109. vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
  110. classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
  111. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))
  112. if (classifierResult != classNumStr): errorCount += 1.0
  113. print("\nthe total number of errors is: %d" % errorCount)
  114. print("\nthe total error rate is: %f" % (errorCount/float(mTest)))

KNN-综合应用的更多相关文章

  1. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  3. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

  4. ML(5):KNN算法

    K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类.这个算法是机器学习里面一个比较经典的算法, ...

  5. 机器学习基础之knn的简单例子

    knn算法是人工智能的基本算法,类似于语言中的"hello world!",python中的机器学习核心模块:Scikit-Learn Scikit-learn(sklearn)模 ...

  6. scikit-learn---PCA(Principle Component Analysis)---KNN(image classifier)

    摘要:PCA为非监督分类方法,常用于数据降维.为监督分类数据预处理,本例采用PCA对人脸特征提取先做降维处理,然后使用KNN算法对图片进行分类 ##1.PCA简介 设法将原来变量重新组合成一组新的互相 ...

  7. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了

    先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...

  8. PCB 加投率计算实现基本原理--K最近邻算法(KNN)

    PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...

  9. 机器学习回顾篇(6):KNN算法

    1 引言 本文将从算法原理出发,展开介绍KNN算法,并结合机器学习中常用的Iris数据集通过代码实例演示KNN算法用法和实现. 2 算法原理 KNN(kNN,k-NearestNeighbor)算法, ...

  10. 如何利用AI识别未知——加入未知类(不太靠谱),检测待识别数据和已知样本数据的匹配程度(例如使用CNN降维,再用knn类似距离来实现),将问题转化为特征搜索问题而非决策问题,使用HTM算法(记忆+模式匹配预测就是智能),GAN异常检测,RBF

    https://www.researchgate.net/post/How_to_determine_unknown_class_using_neural_network 里面有讨论,说是用rbf神经 ...

随机推荐

  1. java通讯录获取汉字首字母

    1.本文只是使用了pinyin4J的主要功能,还有更多更好耍的功能,大家可以去研究官网文档.哈哈 2.pinyin4j的官方下载地址:https://sourceforge.net/projects/ ...

  2. LeetCode 34. 搜索范围(search for a range)

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...

  3. 黑马lavarel教程---4、csrf验证及相关

    黑马lavarel教程---4.csrf验证及相关 一.总结 一句话总结: csrf验证就像短信验证码那样验证用户身份,这个验证是为了验证是本站的操作,用的是一个token字符串,外站如果有了这个to ...

  4. Jquery 选择器的用法

    用js 动态生成<ul>标签的<li>条目,因为在动态的创建过程中li的点击事件是不太方便的,因此采用JQuery 的类选择器来实现. html代码: <div id=& ...

  5. 改善EDM数据营销的关键点

    EDM数据营销有效增加潜在顾客.提升销售量,而成效得看你的邮件到达率.当点选发送后,邮件需要经过层层关卡才能够进入联络人收件箱,若是你的发送评级越好,邮件越容易进入收件箱.评级非常重要,它能够证明你是 ...

  6. 十五:jinja2过滤器之实现自定义过滤器

    过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值 1.在python文件中写好过滤的函数和逻辑2.将将函数注册到 ...

  7. jQuery 获得内容

    地址 text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 一.text()  html() &l ...

  8. 汇编语言——用DOSBox的debug查看CPU和内存 & 用机器指令和汇编指令编程

    实验一 查看CPU和内存,用机器指令和汇编指令编程   实验目的 了解什么是Debug,以及Debug中需要用的一些功能 R:查看.改变CPU寄存器的内容 D:查看内存中的内容 E:改写内存中的内容 ...

  9. 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BW系列]SAP 讲讲BW/4 HANA和BW ...

  10. python学习之数据类型(set)

    3.9 集合(set) 3.9.1 介绍 ​ 集合是一个无序且不重复的元素集合.元素必须是可哈希的(int,str,tuple,bool).可以把它看作是dic的key的集合.用{}表示. ​ 注意: ...