1. #encoding:utf-8
  2. from numpy import *
  3. import operator
  4. import matplotlib
  5. import matplotlib.pyplot as plt
  6.  
  7. from os import listdir
  8.  
  9. def makePhoto(returnMat,classLabelVector): #创建散点图
  10. fig = plt.figure()
  11. ax = fig.add_subplot(111) #例如参数为349时,参数349的意思是:将画布分割成3行4列,图像画在从左到右从上到下的第9块
  12. ax.scatter(returnMat[:,1],returnMat[:,2],15.0*array(classLabelVector),15.0*array(classLabelVector)) #前两个函数参数的意义是横坐标和纵坐标
  13. plt.show()
  14.  
  15. def classify0(inX, dataSet, labels, k): #k近邻算法 inX为分类向量 dataSet为训练数据集 labels为标签列表 k:选择距离最小的k个点
  16. dataSetSize = dataSet.shape[0] #获得dataSet的第一维长度
  17. diffMat = tile(inX, (dataSetSize, 1)) - dataSet #将向量inX重复1次,共dataSetSize行。然后减去dataSet
  18. sqDiffMat = diffMat ** 2 #diffMat矩阵的每个元素平方
  19. sqDistances = sqDiffMat.sum(axis=1) #按行求和,即求每一行的和,得到一个list
  20. distances = sqDistances ** 0.5 #对sqDistances的每个元素开方
  21. sortedDistIndicies = distances.argsort() #返回distances从小到大的索引
  22. #例如,x=np.array([3.2.1]) np.argsort(x) 得到的结果为array([1.2.0])
  23. classCount = {} #python花括号代表代表dict字典数据类型,[]代表list,()代表元组,(55,)一个值的元组
  24. for i in range(k):
  25. voteIlabel = labels[sortedDistIndicies[i]] #依次取出最小的元素
  26. classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #如果存在加1,不存在默认为0
  27. sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #第一个参数为比较的list,第二个参数为比较的对象(这里指的是键值对的value),第三个参数是升序或降序(默认为false(升序排列))
  28. return sortedClassCount[0][0] #取得次数最多的key
  29.  
  30. def createDataSet(): #创建数据集
  31. group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
  32. labels = ['A', 'A', 'B', 'B']
  33. return group, labels
  34.  
  35. def file2matrix(filename): #解析文本
  36. fr = open(filename)
  37. numberOfLines = len(fr.readlines()) #得到文本的行数
  38. returnMat = zeros((numberOfLines, 3)) #构造一个行数为文本行数,列数为3的0矩阵
  39. classLabelVector = [] #标签列表
  40. fr = open(filename)
  41. index = 0
  42. for line in fr.readlines(): #读取文件的每一行
  43. line = line.strip() #删除符号,此处参数为空,表示删除空白符
  44. listFromLine = line.split('\t') #以\t符号为分隔符
  45. returnMat[index, :] = listFromLine[0:3] #将listFromLine的0到3赋值给returnMat的index行
  46. classLabelVector.append(int(listFromLine[-1])) #将listFromLine的最后一个元素添加到classLabelVector
  47. index += 1 #下标加1
  48. return returnMat, classLabelVector
  49.  
  50. def autoNorm(dataSet): #归一化特征值
  51. minVals = dataSet.min(0) #取每列的最小值赋值给minVals,是一个list
  52. maxVals = dataSet.max(0) #取每列的最大值赋值给maxVals
  53. ranges = maxVals - minVals
  54. normDataSet = zeros(shape(dataSet))
  55. m = dataSet.shape[0]
  56. normDataSet = dataSet - tile(minVals, (m, 1)) #取到与最小值的差
  57. normDataSet = normDataSet / tile(ranges, (m, 1)) #除以范围
  58. return normDataSet, ranges, minVals
  59.  
  60. def datingClassTest():
  61. hoRatio = 0.50 # 测试用例占用比例
  62. datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') # 读取数据
  63. normMat, ranges, minVals = autoNorm(datingDataMat) #特征值归一化
  64. m = normMat.shape[0]
  65. numTestVecs = int(m * hoRatio)
  66. errorCount = 0.0
  67. for i in range(numTestVecs):
  68. classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3) #第numTestVecs到m是样本数据,前m个是测试数据
  69. print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) #打印预测值和标签值
  70. if (classifierResult != datingLabels[i]): errorCount += 1.0
  71. print "the total error rate is: %f" % (errorCount / float(numTestVecs))
  72. print errorCount
  73.  
  74. #输入某人的信息,便得出对对方喜欢程度的预测值
  75. def classifyPerson():
  76. resultList = ['一点也不喜欢', '有点喜欢', '非常喜欢']
  77. percentTats = float(raw_input("玩视频游戏所耗时间百分比是:"))#输入
  78. ffMiles = float(raw_input("飞行里程数是:"))
  79. iceCream = float(raw_input("每周消费的冰淇淋公升数是:"))
  80. datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') #读入样本文件,其实不算是样本,是一个标准文件
  81. normMat, ranges, minVals = autoNorm(datingDataMat)#归一化
  82. inArr = array([ffMiles, percentTats, iceCream])#组成测试向量
  83. classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels,3)#进行分类
  84. print '你对这种人的看法可能是:', resultList[classifierResult - 1]#打印结果
  85.  
  86. def img2vector(filename): #将图片转化成向量
  87. returnVect = zeros((1, 1024))
  88. fr = open(filename)
  89. for i in range(32):
  90. lineStr = fr.readline()
  91. for j in range(32):
  92. returnVect[0, 32 * i + j] = int(lineStr[j])
  93. return returnVect
  94.  
  95. def handwritingClassTest():
  96. hwLabels = []
  97. trainingFileList = listdir('trainingDigits') # 加载文件夹trainingDigits目录下文件列表
  98. m = len(trainingFileList)
  99. trainingMat = zeros((m, 1024))
  100. for i in range(m):
  101. fileNameStr = trainingFileList[i]
  102. fileStr = fileNameStr.split('.')[0]
  103. classNumStr = int(fileStr.split('_')[0]) #得到标签
  104. hwLabels.append(classNumStr) #加入标签列表
  105. trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr) #解析文件得到向量
  106. testFileList = listdir('testDigits') # 测试数据
  107. errorCount = 0.0
  108. mTest = len(testFileList)
  109. for i in range(mTest):
  110. fileNameStr = testFileList[i]
  111. fileStr = fileNameStr.split('.')[0]
  112. classNumStr = int(fileStr.split('_')[0])
  113. vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
  114. classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
  115. print "分类器返回的结果: %d, 真实结果: %d" % (classifierResult, classNumStr)
  116. if (classifierResult != classNumStr): errorCount += 1.0 #计算得到结果与标签比较
  117. print "\n错误总数为: %d" % errorCount
  118. print "\n错误率为: %f" % (errorCount / float(mTest))
  119.  
  120. if __name__ == '__main__':
  121. # print("main")
  122. # returnMat, classLabelVector = file2matrix('datingTestSet2.txt')
  123. # #makePhoto(returnMat,classLabelVector)
  124. # normDataSet, ranges, minVals = autoNorm(returnMat)
  125. # print(normDataSet)
  126. # print(ranges)
  127. # print(minVals)
  128. #classifyPerson()
  129. # textVector = img2vector("testDigits/0_13.txt")
  130. # print textVector[0,0:31]
  131. handwritingClassTest()

机器学习实战笔记--k近邻算法的更多相关文章

  1. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  2. 《机器学习实战》-k近邻算法

    目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python ...

  3. 机器学习实战笔记-2-kNN近邻算法

    # k-近邻算法(kNN) 本质是(提取样本集中特征最相似数据(最近邻)的k个分类标签). K-近邻算法的优缺点 例 优点:精度高,对异常值不敏感,无数据输入假定: 缺点:计算复杂度高,空间复杂度高: ...

  4. 《机器学习实战》——K近邻算法

    三要素:距离度量.k值选择.分类决策 原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最 ...

  5. 机器学习实战笔记-k-近邻算法

    机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...

  6. 机器学习实战python3 K近邻(KNN)算法实现

    台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...

  7. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  8. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  9. R语言学习笔记—K近邻算法

    K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...

随机推荐

  1. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  2. highlight.js 代码高亮插件

    官网:https://highlightjs.org/ API:http://highlightjs.readthedocs.org/en/latest/api.html 1. 简单使用: <l ...

  3. 举个栗子学习JavaScript设计模式

    目录 前言 创建型模式 单例模式 构造器+原型 简单工厂模式 工厂模式 创建型模式比较 结构性模式 模块模式 外观模式 混入模式 装饰模式 适配模式 行为型模式 观察者模式 中介者模式 命令模式 责任 ...

  4. Discuz X3.2 网站快照被劫持的解决方法

    附上另一个人的解决方法:http://www.discuz.net/thread-3549930-3-1.html 问题如下: 快照被劫持,无论怎么申诉,怎么更新快照,都无法消除此问题,第一次打开网站 ...

  5. go语言注释

    Go语言注释实例代码教程 - Go支持C语言风格的/* */块注释,也支持C++风格的//行注释. 当然,行注释更通用,块注释主要用于针对包的详细说明或者屏蔽大块的代码. 每个包都应有一个包注解,即 ...

  6. 不到一百行实现一个小siri

    想要容易理解核心的特征计算的话建议先去看看我之前的听歌识曲的文章,传送门:http://www.cnblogs.com/chuxiuhong/p/6063602.html 本文主要是实现了一个简单的命 ...

  7. pycharm连接mysql数据库

    新的环境配置pycharm的项目时,发现pycharm不能连接到mysql数据库.由于安了java环境但是还没配置相关的库,并且jetbrains家的IDE一般都是java写的,于是猜想可能是java ...

  8. AngularJS中get请求URL出现跨域问题

    今天早上帮助同学看了一个AngularJS的问题,主要是请求中出现了跨域访问,请求被阻止. 下面是她给我的代码: <html lang="en" ng-app="m ...

  9. wxWidgets

    wxWidgets Code::Blocks环境 Code::Blocks下载: Code::Blocks使用: codeblocks-16.01mingw-setup.exe 它的gcc版本为4.9 ...

  10. 货架工程项目之js dom实现项目工程进度图

    笔者最近要负责有个项目工程网站的安装进度过程,实现的效果要求大概如下图所示 由于笔者没有参与到数据库的制作,得知他们这个项目设计工序的时候就一个开始日期的和完成日期,连整个项目的安装结束时间都没有简直 ...