(分类)KNN近邻法.docx

上传人:1595****071 文档编号:33779413 上传时间:2022-08-12 格式:DOCX 页数:11 大小:322.74KB
返回 下载 相关 举报
(分类)KNN近邻法.docx_第1页
第1页 / 共11页
(分类)KNN近邻法.docx_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《(分类)KNN近邻法.docx》由会员分享,可在线阅读,更多相关《(分类)KNN近邻法.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、_一、kNN算法分析 K最近邻(k-Nearest Neighbor,KNN)分类算法可以说是最简单的机器学习算法了。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 比如上面这个图,我们有两类数据,分别是蓝色方块和红色三角形,他们分布在一个上图的二维中间中。那么假如我们有一个绿色圆圈这个数据,需要判断这个数据是属于蓝色方块这一类,还是与红色三角形同类。怎么做呢?我们先把离这个绿色圆圈最近的几个点找到,因为我们觉得离绿色圆圈最近的才对它的类别有判断的帮助。那到底要用多少

2、个来判断呢?这个个数就是k了。如果k=3,就表示我们选择离绿色圆圈最近的3个点来判断,由于红色三角形所占比例为2/3,所以我们认为绿色圆是和红色三角形同类。如果k=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。从这里可以看到,k的值还是很重要的。 KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。 该算法在分类时有个主要的不足是,当样本不平衡时

3、,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分参考机器学习十大算法。 总的来说就是我们已经存在了一个带标签的数据库,然后输入没有标签的新数据后,将新数据的每个特征与样本集中

4、数据对应的特征进行比较,然后算法提取样本集中特征最相似(最近邻)的分类标签。一般来说,只选择样本数据库中前k个最相似的数据。最后,选择k个最相似数据中出现次数最多的分类。其算法描述如下:1)计算已知类别数据集中的点与当前点之间的距离;2)按照距离递增次序排序;3)选取与当前点距离最小的k个点;4)确定前k个点所在类别的出现频率;5)返回前k个点出现频率最高的类别作为当前点的预测分类。二、Python实现 对于机器学习而已,Python需要额外安装三件宝,分别是Numpy,scipy和Matplotlib。前两者用于数值计算,后者用于画图。安装很简单,直接到各自的官网下载回来安装即可。安装程序会

5、自动搜索我们的python版本和目录,然后安装到python支持的搜索路径下。反正就python和这三个插件都默认安装就没问题了。 另外,如果我们需要添加我们的脚本目录进Python的目录(这样Python的命令行就可以直接import),可以在系统环境变量中添加:PYTHONPATH环境变量,值为我们的路径,例如:E:PythonMachine Learning in Action2.1、kNN基础实践 一般实现一个算法后,我们需要先用一个很小的数据库来测试它的正确性,否则一下子给个大数据给它,它也很难消化,而且还不利于我们分析代码的有效性。 首先,我们新建一个kNN.py脚本文件,文件里面

6、包含两个函数,一个用来生成小数据库,一个实现kNN分类算法。代码如下:python1. #2. #kNN:kNearestNeighbors3. 4. #Input:newInput:vectortocomparetoexistingdataset(1xN)5. #dataSet:sizemdatasetofknownvectors(NxM)6. #labels:datasetlabels(1xMvector)7. #k:numberofneighborstouseforcomparison8. 9. #Output:themostpopularclasslabel10. #11. 12. f

7、romnumpyimport*13. importoperator14. 15. #createadatasetwhichcontains4sampleswith2classes16. defcreateDataSet():17. #createamatrix:eachrowasasample18. group=array(1.0,0.9,1.0,1.0,0.1,0.2,0.0,0.1)19. labels=A,A,B,B#foursamplesandtwoclasses20. returngroup,labels21. 22. #classifyusingkNN23. defkNNClass

8、ify(newInput,dataSet,labels,k):24. numSamples=dataSet.shape0#shape0standsforthenumofrow25. 26. #step1:calculateEuclideandistance27. #tile(A,reps):ConstructanarraybyrepeatingArepstimes28. #thefollowingcopynumSamplesrowsfordataSet29. diff=tile(newInput,(numSamples,1)-dataSet#Subtractelement-wise30. sq

9、uaredDiff=diff*2#squaredforthesubtract31. squaredDist=sum(squaredDiff,axis=1)#sumisperformedbyrow32. distance=squaredDist*0.533. 34. #step2:sortthedistance35. #argsort()returnstheindicesthatwouldsortanarrayinaascendingorder36. sortedDistIndices=argsort(distance)37. 38. classCount=#defineadictionary(

10、canbeappendelement)39. foriinxrange(k):40. #step3:choosetheminkdistance41. voteLabel=labelssortedDistIndicesi42. 43. #step4:countthetimeslabelsoccur44. #whenthekeyvoteLabelisnotindictionaryclassCount,get()45. #willreturn046. classCountvoteLabel=classCount.get(voteLabel,0)+147. 48. #step5:themaxvoted

11、classwillreturn49. maxCount=050. forkey,valueinclassCount.items():51. ifvaluemaxCount:52. maxCount=value53. maxIndex=key54. 55. returnmaxIndex 然后我们在命令行中这样测试即可:python1. importkNN2. fromnumpyimport*3. 4. dataSet,labels=kNN.createDataSet()5. 6. testX=array(1.2,1.0)7. k=38. outputLabel=kNN.kNNClassify(t

12、estX,dataSet,labels,3)9. printYourinputis:,testX,andclassifiedtoclass:,outputLabel10. 11. testX=array(0.1,0.3)12. outputLabel=kNN.kNNClassify(testX,dataSet,labels,3)13. printYourinputis:,testX,andclassifiedtoclass:,outputLabel 这时候会输出:python1. Yourinputis:1.21.0andclassifiedtoclass:A2. Yourinputis:0.

13、10.3andclassifiedtoclass:B2.2、kNN进阶 这里我们用kNN来分类一个大点的数据库,包括数据维度比较大和样本数比较多的数据库。这里我们用到一个手写数字的数据库,可以到下载。这个数据库包括数字0-9的手写体。每个数字大约有200个样本。每个样本保持在一个txt文件中。手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据库解压后有两个目录:目录trainingDigits存放的是大约2000个训练数据,testDigits存放大约900个测试数据。 这里我们还是新建一个kNN.py脚本文件,文件里面包含四个函

14、数,一个用来生成将每个样本的txt文件转换为对应的一个向量,一个用来加载整个数据库,一个实现kNN分类算法。最后就是实现这个加载,测试的函数。python1. #2. #kNN:kNearestNeighbors3. 4. #Input:inX:vectortocomparetoexistingdataset(1xN)5. #dataSet:sizemdatasetofknownvectors(NxM)6. #labels:datasetlabels(1xMvector)7. #k:numberofneighborstouseforcomparison8. 9. #Output:themost

15、popularclasslabel10. #11. 12. fromnumpyimport*13. importoperator14. importos15. 16. 17. #classifyusingkNN18. defkNNClassify(newInput,dataSet,labels,k):19. numSamples=dataSet.shape0#shape0standsforthenumofrow20. 21. #step1:calculateEuclideandistance22. #tile(A,reps):ConstructanarraybyrepeatingArepsti

16、mes23. #thefollowingcopynumSamplesrowsfordataSet24. diff=tile(newInput,(numSamples,1)-dataSet#Subtractelement-wise25. squaredDiff=diff*2#squaredforthesubtract26. squaredDist=sum(squaredDiff,axis=1)#sumisperformedbyrow27. distance=squaredDist*0.528. 29. #step2:sortthedistance30. #argsort()returnsthei

17、ndicesthatwouldsortanarrayinaascendingorder31. sortedDistIndices=argsort(distance)32. 33. classCount=#defineadictionary(canbeappendelement)34. foriinxrange(k):35. #step3:choosetheminkdistance36. voteLabel=labelssortedDistIndicesi37. 38. #step4:countthetimeslabelsoccur39. #whenthekeyvoteLabelisnotind

18、ictionaryclassCount,get()40. #willreturn041. classCountvoteLabel=classCount.get(voteLabel,0)+142. 43. #step5:themaxvotedclasswillreturn44. maxCount=045. forkey,valueinclassCount.items():46. ifvaluemaxCount:47. maxCount=value48. maxIndex=key49. 50. returnmaxIndex51. 52. #convertimagetovector53. defim

19、g2vector(filename):54. rows=3255. cols=3256. imgVector=zeros(1,rows*cols)57. fileIn=open(filename)58. forrowinxrange(rows):59. lineStr=fileIn.readline()60. forcolinxrange(cols):61. imgVector0,row*32+col=int(lineStrcol)62. 63. returnimgVector64. 65. #loaddataSet66. defloadDataSet():67. #step1:Getting

20、trainingset68. print-Gettingtrainingset.69. dataSetDir=E:/Python/MachineLearninginAction/70. trainingFileList=os.listdir(dataSetDir+trainingDigits)#loadthetrainingset71. numSamples=len(trainingFileList)72. 73. train_x=zeros(numSamples,1024)74. train_y=75. foriinxrange(numSamples):76. filename=traini

21、ngFileListi77. 78. #gettrain_x79. train_xi,:=img2vector(dataSetDir+trainingDigits/%s%filename)80. 81. #getlabelfromfilenamesuchas1_18.txt82. label=int(filename.split(_)0)#return183. train_y.append(label)84. 85. #step2:Gettingtestingset86. print-Gettingtestingset.87. testingFileList=os.listdir(dataSe

22、tDir+testDigits)#loadthetestingset88. numSamples=len(testingFileList)89. test_x=zeros(numSamples,1024)90. test_y=91. foriinxrange(numSamples):92. filename=testingFileListi93. 94. #gettrain_x95. test_xi,:=img2vector(dataSetDir+testDigits/%s%filename)96. 97. #getlabelfromfilenamesuchas1_18.txt98. labe

23、l=int(filename.split(_)0)#return199. test_y.append(label)100. 101. returntrain_x,train_y,test_x,test_y102. 103. #testhandwritingclass104. deftestHandWritingClass():105. #step1:loaddata106. printstep1:loaddata.107. train_x,train_y,test_x,test_y=loadDataSet()108. 109. #step2:training.110. printstep2:t

24、raining.111. pass112. 113. #step3:testing114. printstep3:testing.115. numTestSamples=test_x.shape0116. matchCount=0117. foriinxrange(numTestSamples):118. predict=kNNClassify(test_xi,train_x,train_y,3)119. ifpredict=test_yi:120. matchCount+=1121. accuracy=float(matchCount)/numTestSamples122. 123. #st

25、ep4:showtheresult124. printstep4:showtheresult.125. printTheclassifyaccuracyis:%.2f%(accuracy*100) 测试非常简单,只需要在命令行中输入:python1. importkNN2. kNN.testHandWritingClass() 输出结果如下:python1. step1:loaddata.2. -Gettingtrainingset.3. -Gettingtestingset.4. step2:training.5. step3:testing.6. step4:showtheresult.7. Theclassifyaccuracyis:98.84%11_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁