kNN算法

算法优缺点:

  • 优点:精度高、对异常值不敏感、无输入数据假定
  • 缺点:时间复杂度和空间复杂度都很高
  • 适用数据范围:数值型和标称型

算法的思路:

KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类。

函数解析:

库函数

  • tile()

    tile(A,n)就是将A重复n次

  1. a = np.array([0, 1, 2])
  2. np.tile(a, 2)
  3. array([0, 1, 2, 0, 1, 2])
  4. np.tile(a, (2, 2))
  5. array([[0, 1, 2, 0, 1, 2],[0, 1, 2, 0, 1, 2]])
  6. np.tile(a, (2, 1, 2))
  7. array([[[0, 1, 2, 0, 1, 2]],[[0, 1, 2, 0, 1, 2]]])
  8. b = np.array([[1, 2], [3, 4]])
  9. np.tile(b, 2)
  10. array([[1, 2, 1, 2],[3, 4, 3, 4]])
  11. np.tile(b, (2, 1))
  12. array([[1, 2],[3, 4],[1, 2],[3, 4]])`

自己实现的函数

createDataSet()生成测试数组
kNNclassify(inputX, dataSet, labels, k)分类函数

  • inputX 输入的参数
  • dataSet 训练集
  • labels 训练集的标号
  • k 最近邻的数目
      1. #coding=utf-8
      2. from numpy import *
      3. import operator
      4.  
      5. def createDataSet():
      6. group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
      7. labels = ['A','A','B','B']
      8. return group,labels
      9. #inputX表示输入向量(也就是我们要判断它属于哪一类的)
      10. #dataSet表示训练样本
      11. #label表示训练样本的标签
      12. #k是最近邻的参数,选最近k个
      13. def kNNclassify(inputX, dataSet, labels, k):
      14. dataSetSize = dataSet.shape[0]#计算有几个训练数据
      15. #开始计算欧几里得距离
      16. diffMat = tile(inputX, (dataSetSize,1)) - dataSet
      17.  
      18. sqDiffMat = diffMat ** 2
      19. sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加
      20. distances = sqDistances ** 0.5
      21. #欧几里得距离计算完毕
      22. sortedDistance = distances.argsort()
      23. classCount = {}
      24. for i in xrange(k):
      25. voteLabel = labels[sortedDistance[i]]
      26. classCount[voteLabel] = classCount.get(voteLabel,0) + 1
      27. res = max(classCount)
      28. return res
      29.  
      30. def main():
      31. group,labels = createDataSet()
      32. t = kNNclassify([0,0],group,labels,3)
      33. print t
      34.  
      35. if __name__=='__main__':
      36. main()


kNN应用实例

手写识别系统的实现

数据集:

两个数据集:training和test。分类的标号在文件名中。像素32*32的。数据大概这个样子:

方法:

kNN的使用,不过这个距离算起来比较复杂(1024个特征),主要是要处理如何读取数据这个问题的,比较方面直接调用就可以了。

速度:

速度还是比较慢的,这里数据集是:training 2000+,test 900+(i5的CPU)

k=3的时候要32s+

    1. #coding=utf-8
    2. from numpy import *
    3. import operator
    4. import os
    5. import time
    6.  
    7. def createDataSet():
    8. group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
    9. labels = ['A','A','B','B']
    10. return group,labels
    11. #inputX表示输入向量(也就是我们要判断它属于哪一类的)
    12. #dataSet表示训练样本
    13. #label表示训练样本的标签
    14. #k是最近邻的参数,选最近k个
    15. def kNNclassify(inputX, dataSet, labels, k):
    16. dataSetSize = dataSet.shape[0]#计算有几个训练数据
    17. #开始计算欧几里得距离
    18. diffMat = tile(inputX, (dataSetSize,1)) - dataSet
    19. #diffMat = inputX.repeat(dataSetSize, aixs=1) - dataSet
    20. sqDiffMat = diffMat ** 2
    21. sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加
    22. distances = sqDistances ** 0.5
    23. #欧几里得距离计算完毕
    24. sortedDistance = distances.argsort()
    25. classCount = {}
    26. for i in xrange(k):
    27. voteLabel = labels[sortedDistance[i]]
    28. classCount[voteLabel] = classCount.get(voteLabel,0) + 1
    29. res = max(classCount)
    30. return res
    31.  
    32. def img2vec(filename):
    33. returnVec = zeros((1,1024))
    34. fr = open(filename)
    35. for i in range(32):
    36. lineStr = fr.readline()
    37. for j in range(32):
    38. returnVec[0,32*i+j] = int(lineStr[j])
    39. return returnVec
    40.  
    41. def handwritingClassTest(trainingFloder,testFloder,K):
    42. hwLabels = []
    43. trainingFileList = os.listdir(trainingFloder)
    44. m = len(trainingFileList)
    45. trainingMat = zeros((m,1024))
    46. for i in range(m):
    47. fileName = trainingFileList[i]
    48. fileStr = fileName.split('.')[0]
    49. classNumStr = int(fileStr.split('_')[0])
    50. hwLabels.append(classNumStr)
    51. trainingMat[i,:] = img2vec(trainingFloder+'/'+fileName)
    52. testFileList = os.listdir(testFloder)
    53. errorCount = 0.0
    54. mTest = len(testFileList)
    55. for i in range(mTest):
    56. fileName = testFileList[i]
    57. fileStr = fileName.split('.')[0]
    58. classNumStr = int(fileStr.split('_')[0])
    59. vectorUnderTest = img2vec(testFloder+'/'+fileName)
    60. classifierResult = kNNclassify(vectorUnderTest, trainingMat, hwLabels, K)
    61. #print classifierResult,' ',classNumStr
    62. if classifierResult != classNumStr:
    63. errorCount +=1
    64. print 'tatal error ',errorCount
    65. print 'error rate',errorCount/mTest
    66.  
    67. def main():
    68. t1 = time.clock()
    69. handwritingClassTest('trainingDigits','testDigits',3)
    70. t2 = time.clock()
    71. print 'execute ',t2-t1
    72. if __name__=='__main__':
    73. main()


kNN算法python实现和简单数字识别的更多相关文章

  1. KNN算法--python实现

    邻近算法 或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  2. 【机器学习】k-近邻算法应用之手写数字识别

    上篇文章简要介绍了k-近邻算法的算法原理以及一个简单的例子,今天再向大家介绍一个简单的应用,因为使用的原理大体差不多,就没有没有过多的解释. 为了具有说明性,把手写数字的图像转换为txt文件,如下图所 ...

  3. KNN算法python实现

    1 KNN 算法 knn,k-NearestNeighbor,即寻找与点最近的k个点. 2 KNN numpy实现 效果: k=1 k=2 3 numpy 广播,聚合操作. 这里求距离函数,求某点和集 ...

  4. KNN算法——python实现

    二.Python实现 对于机器学习而已,Python需要额外安装三件宝,分别是Numpy,scipy和Matplotlib.前两者用于数值计算,后者用于画图.安装很简单,直接到各自的官网下载回来安装即 ...

  5. 神经网络(BP)算法Python实现及简单应用

    首先用Python实现简单地神经网络算法: import numpy as np # 定义tanh函数 def tanh(x): return np.tanh(x) # tanh函数的导数 def t ...

  6. KNN算法python实现小样例

    K近邻算法概述优点:精度高.对异常数据不敏感.无数据输入假定缺点:计算复杂度高.空间复杂度高适用数据范围:数值型和标称型工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签 ...

  7. [Solution] 简单数字识别之Tesseract

    图像识别涉及的理论:傅里叶变换,图形形态学,滤波,矩阵变换等等. Tesseract的出现为了解决在没有这些复杂的理论基础,快速识别图像的框架. 准备: 1.样本图像学习,预处理 (平均每1个元素出现 ...

  8. 深度学习(一):Python神经网络——手写数字识别

    声明:本文章为阅读书籍<Python神经网络编程>而来,代码与书中略有差异,书籍封面: 源码 若要本地运行,请更改源码中图片与数据集的位置,环境为 Python3.6x. 1 import ...

  9. 基于sk_learn的k近邻算法实现-mnist手写数字识别且要求97%以上精确率

    1. 导入需要的库 from sklearn.datasets import fetch_openml import numpy as np from sklearn.neighbors import ...

随机推荐

  1. 关于Wireshark "The NPF driver isn’t running……"解决办法

    启动Wireshark软件时出现了如下图所示的错误,就搜索了一下解决方法,特总结如下: 这个错误是因为没有开启NPF服务造成的.简要说一下NPF吧. NPF即网 络数据包过滤器(Netgroup Pa ...

  2. 【BZOJ-3553】三叉神经树 树链剖分

    3553: [Shoi2014]三叉神经树 Time Limit: 160 Sec  Memory Limit: 256 MBSubmit: 347  Solved: 112[Submit][Stat ...

  3. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...

  4. [C#] 图文解说调用WebServer实例

    本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...

  5. 文件夹锁定(Source)

    文件夹锁定(Source)private void Lock(string folderPath){    try    {        string adminUserName = Environ ...

  6. Ubuntu操作系统下软件的卸载

    1.查找安装文件列表 $ dpkg --list 2. 将列表名录复制粘贴到文本文件中 3. 搜索关键词,找到准确的名称 4. 在终端中执行命令: $ sudo apt-get --purge rem ...

  7. GNURadio 使用问题

  8. tyvj1463 智商问题

    背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...

  9. JavaScript -- 小试牛刀

    //var a = parseInt(window.prompt("请输入一个数字!","")); //switch(a) { // case 1 : // c ...

  10. UVa2521

    理解:max 记录的是有大牌的个数 mid 是有中断 而造成的不确定  我理解是一个间断点以下的 数和一个间断点抵消 在前面没有间断的情况下 才能确定这张牌稳赢 #include<iostrea ...