kNN--近邻算法

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。

在机器学习中常用于分类。

数学内容:

欧氏距离公式,矩阵运算,归一化数值

python模块:

numpy,operator(用其中的itemgetter做排序),listdir(列出目录中的文件),matplotlib.pyplot(可视化数据分析数据),

PIL(对图片进行处理)

  1. from numpy import *
  2. import operator
  3. from os import listdir
  4.  
  5. def createDataSet():
  6. groups=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
  7. lables=['A','A','B','B']
  8. return groups,lables
  9.  
  10. #k-近邻算法
  11. def classify0(inX, dataset,labels,k):
  12. #获取样本集中有几组数据
  13. datasetSize=dataset.shape[0]
  14. #欧氏距离公式 计算距离
  15. diffMat=tile(inX, (datasetSize, 1)) - dataset
  16. sqDiffMat=diffMat**2
  17. sqDistances=sqDiffMat.sum(axis=1)
  18. distances=sqDistances**0.5
  19. #按距离递增排列,返回样本集中的index
  20. sortedDistances=distances.argsort()
  21. classCount={}
  22. for i in range(k):
  23. #根据距离递增的顺序,获取与其对应的类别(即目标变量)
  24. voteIlabel=labels[sortedDistances[i]]
  25. #为k个元素所在的分类计数
  26. classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
  27. #通过对比每个类别出现的次数(即classCount value),以递减的顺序排序
  28. sortedCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
  29. #返回计数最大的那个类别的值
  30. return sortedCount[0][0]
  31.  
  32. #准备数据
  33. def file2matrix(filename):
  34. fr=open(filename)
  35. arrayOLines=fr.readlines()
  36. #获取文件行数
  37. numberOflines=len(arrayOLines)
  38. #创建一个以文件行数为行,3列的矩阵
  39. returnMatrix=zeros((numberOflines,3))
  40. #定义一个存放目标变量(类别)的数组
  41. classLabelVector=[]
  42. index=0
  43. #遍历文件
  44. for line in arrayOLines:
  45. line=line.strip()
  46. listFromLine=line.split('\t')
  47. #把文件前三列添加到返回的矩阵中
  48. returnMatrix[index:]=listFromLine[0:3]
  49. #文件最后一列(对应的类别)添加到类别数组中
  50. classLabelVector.append(int(listFromLine[-1]))
  51. index+=1
  52. #返回数据特征矩阵和类别数组
  53. return returnMatrix,classLabelVector
  54.  
  55. #通过公式 "newValue=(oldValue-min)/(max-min)" 将任意取值范围的特征值转化为0到1区间内的值
  56. def autoNorm(dataset):
  57. #返回每列的最小值
  58. minVals=dataset.min(0)
  59. #返回每列的最大值
  60. maxVals=dataset.max(0)
  61. #返回最大值与最小值的差
  62. ranges=maxVals-minVals
  63. #创建与dataset同行同列的0矩阵
  64. normDataset=zeros(shape(dataset))
  65. #返回dataset的行数
  66. m=dataset.shape[0]
  67. #创建一个重复m次的minVals矩阵,并与dataset相减
  68. normDataset=dataset-tile(minVals,(m,1))
  69. #newValue=(oldValue-min)/(max-min)
  70. normDataset=normDataset/tile(ranges,(m,1))
  71. return normDataset,ranges,minVals
  72.  
  73. #测试算法
  74. def datingClassTest():
  75. #设定测试数据比例
  76. hoRatio=0.10
  77. #返回格式化后的数据和其标签
  78. datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
  79. #归一化数据值
  80. normMat,ranges,minVals=autoNorm(datingDataMat)
  81. #数据的行数
  82. m=normMat.shape[0]
  83. #测试数据的行数
  84. numTestVecs=int(m*hoRatio)
  85. #设置错误预测计数器
  86. errorCount=0.0
  87. #向k-近邻算法中传numTestVecs个测试数据,并把返回的预测数据与真实数据比较返回,若错误,计数器加1
  88. for i in range(numTestVecs):
  89. """
  90. 调用k-近邻算法,为其传入参数,
  91. normMat[i]:第i个测试数据,
  92. normMat[numTestVecs:m,:]:从numTestVecs到m个样本数据,(m可以不写,相当于从numTestVecs索引开始,取剩下所有的normMat数据)
  93. datingLabels[numTestVecs:m]:从numTestVecs到m个样本数据对应的标签
  94. 3:k的值
  95. """
  96. classifierResult=classify0(normMat[i],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
  97. #判断预测数据与真实数据,如果是错误的,则以红字体输出,并错误预测计数器加1
  98. if (classifierResult!=datingLabels[i]):
  99. print("\033[0;31mthe classifier came back with: %d, the real answer is: %d\033[0m" % (classifierResult, datingLabels[i]))
  100. errorCount+=1.0
  101. else:
  102. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
  103. print("the total error rate is:%f" %(errorCount/float(numTestVecs)))
  104.  
  105. #约会系统
  106. def classifiyPerson():
  107. #设定分类(标签)列表
  108. resultList=["not at all", "in small doses", "in large doses"]
  109. #提示用户输入相应内容
  110. percentTats=float(input("percentage of time spent playing video games?"))
  111. ffMiles=float(input("frequent filer miles earned per year?"))
  112. iceCream=float(input("liters of ice cream consumed per year?"))
  113. #把用户输入的三个特征值格式化成numpy.array数据类型
  114. inArr=array([ffMiles,percentTats,iceCream])
  115. #准备样本数据及对应标签
  116. datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
  117. #归一化样本数据并返回ranges和minVals,以便归一化用户输入的数据
  118. normMat,ranges,minVals=autoNorm(datingDataMat)
  119. #调用k-近邻算法,并把传入的预测数据特征做归一化
  120. classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
  121. #打印出预测出的类别,因为样本数据中的类别(标签)为1,2,3,其index是0,1,2,所以要用预测出的分类(1,2,3)减1
  122. print("You will probably like this person: %s" %(resultList[classifierResult-1]))
  123.  
  124. #将32x32的二进制图像文件转换成1x1024的向量
  125. def img2vector(filename):
  126. #创建一个1x1024的0矩阵
  127. returnVect=zeros((1,1024))
  128. fr=open(filename)
  129. """
  130. 因为已知文件是32x32,即有文件中32行内容,通过readline()方法遍历文件,得到文件的每行内容lineStr
  131. 再遍历每行内容lineStr,并把遍历出的内容添加到returnVect矩阵里
  132. """
  133. for i in range(32):
  134. lineStr=fr.readline()
  135. for j in range(32):
  136. returnVect[0,32*i+j]=int(lineStr[j])
  137. return returnVect
  138.  
  139. #手写数字识别系统
  140. def handwritingClassTest():
  141. #创建数据标签集合
  142. hwLabels=[]
  143. #列出目录冲所有文件
  144. trainingFileList=listdir('digits/trainingDigits')
  145. #得到文件个数,也就是训练数据的行数
  146. m=len(trainingFileList)
  147. #创建一个m行,1024列的0矩阵
  148. trainingMat=zeros((m,1024))
  149. """
  150. 通过遍历所有训练文件,得到文件名,其对应的数字(eg:0_7.txt),并把数字添加到hwLabels集合,
  151. 通过上面的img2vector函数,得到一个与该文件对应的1x1024矩阵,并添加到trainingMat矩阵中
  152. """
  153. for i in range(m):
  154. fileNameStr=trainingFileList[i]
  155. fileStr=fileNameStr.split('.')[0]
  156. classNumStr=int(fileStr.split('_')[0])
  157. hwLabels.append(classNumStr)
  158. trainingMat[i,:]=img2vector('digits/trainingDigits/%s' % fileNameStr)
  159. #对测试数据做同样的操作
  160. testFileList=listdir('digits/testDigits')
  161. mTest=len(testFileList)
  162. errorCount=0.0
  163. for i in range(mTest):
  164. fileNameStr=testFileList[i]
  165. fileStr=fileNameStr.split('.')[0]
  166. classNumStr=int(fileStr.split('_')[0])
  167. vectorUnderTest=img2vector('digits/testDigits/%s' % fileNameStr)
  168. classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
  169. if (classifierResult!=classNumStr):
  170. print("\033[0;31mthe classifier came back with: %d, the real answer is: %d\033[0m" % (classifierResult,classNumStr))
  171. errorCount+=1
  172. else:
  173. print("the classifier came back with: %d, the real answer is: %d" %(classifierResult,classNumStr))
  174. print("\nthe total number of errors is: %d" % errorCount)
  175. print("\nthe total error rate is: %f" %(errorCount/float(mTest)))
  176.  
  177. #在网上找数字图片做测试
  178. def imgNumClassTest(filename):
  179. hwLabels=[]
  180. trainingFileList=listdir('digits/trainingDigits')
  181. m=len(trainingFileList)
  182. trainingMat=zeros((m,1024))
  183. for i in range(m):
  184. fileNameStr=trainingFileList[i]
  185. fileStr=fileNameStr.split('.')[0]
  186. classNumStr=int(fileStr.split('_')[0])
  187. hwLabels.append(classNumStr)
  188. trainingMat[i,:]=img2vector('digits/trainingDigits/%s' % fileNameStr)
  189. vectorUnderTest=img2vector(filename)
  190. classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
  191. print(classifierResult)

约会网站案列数据分析代码:

  1. """
  2. 分析数据
  3. """
  4.  
  5. import kNN
  6. from numpy import *
  7. import matplotlib
  8. import matplotlib.pyplot as plt
  9.  
  10. datingDataMat,datingLabels=kNN.file2matrix('datingTestSet2.txt')
  11. #创建一个图片窗口,默认是1(figure1)
  12. fig=plt.figure()
  13. #在图片窗口创建两行一列的子图,并使用第一行第一列,即211的含义
  14. ax1=fig.add_subplot(211)
  15. """
  16. 创建散点图,x轴是datingDataMat第一列的数据,y轴是datinDataMat第二列的数据,
  17. 后面两个参数一个代表颜色,一个代表点的大小,两个参数同时放大15倍,然后这个时候就是同一个label用一种颜色和大小表示出来,
  18. 不同的label的点的大小和颜色会不一样。
  19. """
  20. ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels))
  21. #设置x轴标签
  22. plt.xlabel('Play game takes time')
  23. #设置y轴标签
  24. plt.ylabel('Eat ice-cream')
  25.  
  26. #在图片窗口中使用第一行第二列
  27. ax2=fig.add_subplot(212)
  28. #把datingLabels转成numpy.array类型
  29. datingLabels=array(datingLabels)
  30. #取datingLabels中值等于1的index
  31. idx_1=where(datingLabels==1)
  32. #idx_1即datingTestSet2.txt文件中第四列值为1的行数,则获取idx_1行,第一二列的数据创建散点图,为这些点设置颜色,大小,label
  33. p1=ax2.scatter(datingDataMat[idx_1,0],datingDataMat[idx_1,1],color = 'm', label='Hate', s = 50)
  34. idx_2=where(datingLabels==2)
  35. p2=ax2.scatter(datingDataMat[idx_2,0],datingDataMat[idx_2,1],color = 'c', label='General', s = 30)
  36. idx_3=where(datingLabels==3)
  37. p3=ax2.scatter(datingDataMat[idx_3,0],datingDataMat[idx_3,1],color = 'r', label='Like', s = 10)
  38. plt.xlabel('Flying')
  39. plt.ylabel('Play game takes time')
  40. #创建图示放置在左上角
  41. plt.legend(loc='upper left')
  42. #显示图片
  43. plt.show()

手写数字识别系统图片转文本文件代码:

  1. from PIL import Image
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4.  
  5. def img2txt(img_path, txt_name):
  6. """
  7. 将图像数据转换为txt文件
  8. :param img_path: 图像文件路径
  9. :type txt_name: 输出txt文件路径
  10. """
  11.  
  12. #把图片转成二值图像,并设长宽均为32
  13. im = Image.open(img_path).convert('').resize((32, 32)) # type:Image.Image
  14. #plt.imshow(im)
  15. #plt.show()
  16.  
  17. #将上面得到的图像转成array数组
  18. data = np.asarray(im)
  19. #将上面得到的数组保存在到文本文件中,指定存储数据类型为整型,分隔符
  20. np.savetxt(txt_name, data, fmt='%d', delimiter='')

kNN--近邻算法的更多相关文章

  1. KNN近邻算法

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

  2. 机器学习之利用KNN近邻算法预测数据

    前半部分是简介, 后半部分是案例 KNN近邻算法: 简单说就是采用测量不同特征值之间的距离方法进行分类(k-Nearest Neighbor,KNN) 优点: 精度高.对异常值不敏感.无数据输入假定  ...

  3. 机器学习入门KNN近邻算法(一)

    1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...

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

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

  5. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  6. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  7. class-k近邻算法kNN

    1 k近邻算法2 模型2.1 距离测量2.2 k值选择2.3 分类决策规则3 kNN的实现--kd树3.1 构造kd树3.2 kd树搜索 1 k近邻算法 k nearest neighbor,k-NN ...

  8. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  9. k近邻算法(KNN)

    k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...

  10. 1. K近邻算法(KNN)

    1. K近邻算法(KNN) 2. KNN和KdTree算法实现 1. 前言 K近邻法(k-nearest neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用, ...

随机推荐

  1. ASP.NET Core Middleware (转载)

    What is Middleware? Put simply, you use middleware components to compose the functionality of your A ...

  2. Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架

    1.模型管理 :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理 :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.运行中流程:查看流程信息.当前任 ...

  3. python2.7下使用logging模块记录日志到终端显示乱码问题解决

    刚才翻了翻2年以前用python2.7写的一个爬虫程序,主要功能就是把各地市知识产权局/专利局网站的专利相关项目.课题通知,定期爬取和分析,辅助企业进行项目申请. 这里要谈的不是爬虫功能的实现,而是今 ...

  4. Oracle 统计信息

    Oracle数据库中的统计信息是这样一组数据:它存储在数据字典中,且从多个维度描述了Oracle数据库里对象的详细信息. CBO会利用这些统计信息来计算目标SQL各种可能的,不同的执行路径的成本,从中 ...

  5. iOS:图片相关(18-02-12更)

    1.图片显示相关 1).图片聊天背景拉伸不失真 2).捏合.双击.下拉缩放 3).Banner.相册 4).动画 2.图片操作相关 1).获取.下载图片(分享.传图片用) 2).保存UIImage到本 ...

  6. NSDate|NSTimeZone|时区|日历

    NSDate,NSDateFormatter以及时区转换-开发者-51CTO博客 iOS 时区转换 东八区 - 简书 iOS时间的时区转换以及一些方法记录 - 简书 iOS - OC NSTimeZo ...

  7. 有关dubbo面试的那些事儿

    dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集 ...

  8. Archlinux+gnome安装中文输入法

    环境:archlinux+gnome 1.首先需要配置Archlinuxcn源 打开/etc/pacman.conf,添加 [archlinuxcn] Server = https://mirrors ...

  9. vue项目使用微信公众号支付总结

    微信公众号支付 1. 使用jssdk调用微信支付,具体查看开发文档: 使用的vuex,在mutations中 wechatPay (state, data) { state.payObject = d ...

  10. django数据库迁移-15

    目录 1.迁移 1.生成迁移文件 2.执行迁移命令 添加测试数据 1.迁移 创建完模型类后,并没有真正的在数据库中创建了数据表,需要执行迁移命令,在数据表中创建数据表. 1.生成迁移文件 manage ...