python的knn算法list_【风马一族_Python】 实施kNN算法

这篇博客详细介绍了如何使用Python的NumPy库实现k-近邻(k-NN)算法。内容涵盖数据集创建、k-NN算法实现、从文本文件解析数据、使用Matplotlib创建散点图、数据归一化、约会网站测试代码、图像转测试向量以及手写数字识别。还讨论了在实际应用中可能遇到的问题和解决方案,如Numpy的安装和使用。
摘要由CSDN通过智能技术生成

一、在PyCharm 5.0.4(编写python程序的IDE) 编写kNN.py文件的代码

--------------------------

1、 kNN.py  运算符模块

--------------------------

1 from numpy import *

2 importoperator3

4 #运算符模块 创建数据集和标签

5 defcreateDataSet():6 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])7 labels = ['A', 'A', 'B', 'B']8 return group, labels

1)、打开命令行

先进入kNN.py的所在文件夹,在对kNN.py进行程序处理,效果如下图所示

1b8cbb87176c37aa73c4b9bb6ce845e6.png

--------------------------

2、 kNN.py  k-近邻算法

--------------------------

1 from numpy import *

2 importoperator3

4 #运算符模块

5 defcreateDataSet():6 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])7 labels = ['A', 'A', 'B', 'B']8 returngroup, labels9

10 #k-近邻算法 此模块需要使用运算符模块的group/labels

11 defclassify0(inX, dataSet, labels, k):12 dataSetSize =dataSet.shape[0]13 diffMat = tile(inX, (dataSetSize, 1)) -dataSet14 sqDiffMat = diffMat ** 2

15 sqDistances = sqDiffMat.sum(axis=1)16 distances = sqDistances ** 0.5

17 sortedDistIndicies =distances.argsort()18 classCount ={}19 for i inrange(k):20 voteIlabel =labels[sortedDistIndicies[i]]21 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

22

23 sortedClassCount =sorted(classCount.iteritems(),24 key=operator.itemgetter(1),25 reverse=True)26 return sortedClassCount[0][0]

2) 在1)的基础上,进行2)的内容,可以修改参数

da651c658d1d20c94fe4af6a320b5acfb1488467.jpg

855bec9430364885d8eadfbbae7069efc22da444.jpg

--------------------------

3、 kNN.py  准备数据:从文本文件中解析数据

--------------------------

1 #将文本记录转换为NumPy的解析程序

2 deffile2matrix(filename):3 fr = open(filename,'r')4 numberOfLines = len(fr.readlines()) #get the number of lines in the file

5 returnMat = zeros((numberOfLines, 3)) #prepare matrix to return

6 classLabelVector = [] #prepare labels return

7 fr =open(filename)8 index =09 for line infr.readlines():10 line =line.strip()11 listFromLine = line.split('\t')12 returnMat[index, :] = listFromLine[0:3]13 classLabelVector.append(int(listFromLine[-1]))14 index += 1

15 return returnMat, classLabelVector

datingTestSet2.txt文件可以从(博客园)文件下载

a6c5c29062ca65fd7df1069d72361190.png

--------------------------

4、 kNN.py  使用Matplotlib创建散点图

--------------------------

7079a5d877cecf1f098c5fecf0205a9f.png

datingTestSet2.txt 文件的数据通过matplotlib,图形化的表现出来

3a38c45935dcc701e21dd060d2438b50bf4ee678.jpg

--------------------------

5、 kNN.py  使用Matplotlib创建散点图  表示不同属性的点,使用不同颜色进行表示

警告:import os

from numpy import *

这两句必须加上,否则会报如下,错误提示信息:

Traceback (most recent call last):

File "", line 1, in

NameError: name 'array' is not defined

--------------------------

4c6a10aea1bd0d0eb0fe91b289a32665.png

让点出现颜色划分的关键代码是:

ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))

c9384ef2553c99644704cdd825b36f0cff0875a0.jpg

--------------------------

6、 kNN.py  归一化特征值

--------------------------

1 #归一化特征值

2 defautoNorm(dataSet):

3 minVals =dataSet.min(0)

4 maxVals =dataSet.max(0)

5 ranges = maxVals -minVals

6 normDataSet =zeros(shape(dataSet))

7 m =dataSet.shape[0]

8 normDataSet = dataSet - tile(minVals, (m, 1))

9 normDataSet = normDataSet / tile(ranges, (m, 1))

10 return normDataSet, ranges, minVals

b8b8ac9d515438e8a0531f52e5864a37.png

--------------------------

7、 kNN.py   分类器针对约会网站的测试代码

--------------------------

1 #分类器针对约会网站的测试代码

2 defdatingClassTest():3 hoRatio = 0.10

4 datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')5 normMat, ranges, minVals =autoNorm(datingDataMat)6 m =normMat.shape[0]7 numTestVecs = int(m *hoRatio)8 errorCount = 0.0

9 for i inrange(numTestVecs):10 classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)11 print "the classifier came back with: %d, the real answer is : %d" %(classifierResult, datingLabels[i])12

13 if (classifierResult !=datingLabels[i]):14 errorCount += 1.0

15

16 print "the total error rate is : %f" % (errorCount / float(numTestVecs))

ed5bf450139fb6657f3414319fd2191c.png

--------------------------

8、 kNN.py   使用算法:构建完整可用系统

--------------------------

1 #! /usr/bin/env python

2 #-*- coding: gbk -*- 用来解决中文乱码的注解

3

4 from numpy import *

5 importoperator6

7 #运算符模块

8 defcreateDataSet():9 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])10 labels = ['A', 'A', 'B', 'B']11 returngroup, labels12

13

14 #k-近邻算法

15 defclassify0(inX, dataSet, labels, k):16 dataSetSize =dataSet.shape[0]17 diffMat = tile(inX, (dataSetSize, 1)) -dataSet18 sqDiffMat = diffMat ** 2

19 sqDistances = sqDiffMat.sum(axis=1)20 distances = sqDistances ** 0.5

21 sortedDistIndicies =distances.argsort()22 classCount ={}23 for i inrange(k):24 voteIlabel =labels[sortedDistIndicies[i]]25 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

26

27 sortedClassCount =sorted(classCount.iteritems(),28 key=operator.itemgetter(1),29 reverse=True)30 returnsortedClassCount[0][0]31

32

33 #将文本记录转换为NumPy的解析程序

34 deffile2matrix(filename):35 fr = open(filename, 'r')36 numberOfLines = len(fr.readlines()) #get the number of lines in the file

37 returnMat = zeros((numberOfLines, 3)) #prepare matrix to return

38 classLabelVector = [] #prepare labels return

39 fr =open(filename)40 index =041 for line infr.readlines():42 line =line.strip()43 listFromLine = line.split('\t')44 returnMat[index, :] = listFromLine[0:3]45 classLabelVector.append(int(listFromLine[-1]))46 index += 1

47 returnreturnMat, classLabelVector48

49

50 #归一化特征值

51 defautoNorm(dataSet):52 minVals =dataSet.min(0)53 maxVals =dataSet.max(0)54 ranges = maxVals -minVals55 normDataSet =zeros(shape(dataSet))56 m =dataSet.shape[0]57 normDataSet = dataSet - tile(minVals, (m, 1))58 normDataSet = normDataSet / tile(ranges, (m, 1))59 returnnormDataSet, ranges, minVals60

61

62 #分类器针对约会网站的测试代码

63 defdatingClassTest():64 hoRatio = 0.10

65 datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')66 normMat, ranges, minVals =autoNorm(datingDataMat)67 m =normMat.shape[0]68 numTestVecs = int(m *hoRatio)69 errorCount = 0.0

70 for i inrange(numTestVecs):71 classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)72 print "分类器的回复是:%d,真正的答案是:%d" %(classifierResult, datingLabels[i])73

74 if (classifierResult !=datingLabels[i]):75 errorCount += 1.0

76

77 print "总误差率 : %f" % (errorCount /float(numTestVecs))78

79

80 #约会网预测函数

81 defclassifyPerson():82 resultList = ['完全没有兴趣', '有一点吧', '特别感兴趣']83 percentTats = float(raw_input("玩电子游戏的时间百分比?"))84 ffMiles = float(raw_input("每年的飞行里程数是多少?"))85 iceCream = float(raw_input("每年的冰淇淋消费量是多少?"))86 datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')87 norMat, ranges, minVals =autoNorm(datingDataMat)88 inArr =array([ffMiles, percentTats, iceCream])89 classifierResult = classify0((inArr - minVals) / ranges, norMat, datingLabels, 3)90 print "你可能会喜欢这个人 :", resultList[classifierResult - 1]

a06d03791abb212031f06ce7eb60384c0fc24cce.jpg

--------------------------

9、 kNN.py   准备数据:将图像转换为测试向量

--------------------------

1 #准备数据:将图像转换为测试向量

2 defimg2vector(filename):3 returnVect = zeros((1, 1024))4 fr =open(filename)5 for i in range(32):6 lineStr =fr.readline()7 for j in range(32):8 returnVect[0, 32 * i + j] =int(lineStr[j])9 return returnVect

ba4e6d5435e0d178ffb61c7f64e1914d.png

--------------------------

10、 kNN.py   测试算法:使用k-近邻算法识别手写数字

注意:本文需要使用  from os import listdir

数据digits.zip 存放在博客园的文件夹中,或者下载《机器学习实战》的源代码,里面有

--------------------------

1 #! /usr/bin/env python

2 #-*- coding: gbk -*-

3

4 from numpy import *

5 importoperator6 from os importlistdir7

8 #测试算法:使用K-近邻算法识别手写数字

9 defhandwritingClassTest():10 hwLabels =[]11 trainingFileList = listdir('trainingDigits')12 m =len(trainingFileList)13 trainingMat = zeros((m, 1024))14 for i inrange(m):15 fileNameStr =trainingFileList[i]16 fileStr = fileNameStr.split('.')[0]17 classNumStr = int(fileStr.split('_')[0])18 hwLabels.append(classNumStr)19 trainingMat[i, :] = img2vector('trainingDigits/%s' %fileNameStr)20

21 testFileList = listdir('testDigits')22 errorCount = 0.0

23 mTest =len(testFileList)24 for i inrange(mTest):25 fileNameStr =testFileList[i]26 fileStr = fileNameStr.split('.')[0]27 classNameStr = int(fileStr.split('_')[0])28 vectorUnderTest = img2vector('testDigits/%s' %fileNameStr)29 classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)30 print "\n分类器的回复是:%d,真正的答案是:%d" %(classifierResult, classNumStr)31

32 if (classifierResult !=classNumStr):33 errorCount += 1.0

34

35 print "\t 错误的总数是 : %d" %errorCount36 print "\t 总误差率是 : %f" % (errorCount / float(mTest))

4fa0e588e8ba56283d2c428be6eb9f2c4e19c37c.jpg

|

|

图片太长,其中截断了,读者可以自行测试看看效果

|

|

e3de7d30aa7333fbcedd2921d9205b24962cf8ca.jpg

-------------------------------------------------------------------------------------------------

总结:以上就是机器学习实战的第二章的代码内容,没想到,三月份开始学习的内容,等到六月份才开始能够成功实现,主要是Numpy的安装,太狗了!

其间,学习安装Numpy与.whl类型的文件,会使用基本的matplotlib。k-近邻算法的模样还没有认清楚。接下来,进行决策树,过一段时间就可以

认识k-近邻算法了吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值