程序清单2-2 

个人程序注释+Python3 部分代码改造(针对int(listFromLine[-1])编译不通过的调整)

先贴2-2的伪代码函数:


[python]

1. def file2matrix(filename):  
2. #open a file, default: 'r'ead  
3.     fr = open(filename)  
4. #一次读取所有行  
5.     arrayOLines = fr.readlines()  
6. #得到行数  
7.     numberOfLines = len(arrayOLines)  
8. #1000*3 zeros matrix,row-1000, column-3  
9. 3))  
10. #声明  
11.     classLabelVector = []  
12.     classLabelVector_Value = []  
13. 0  
14. #逐行扫描  
15. for line in arrayOLines:  
16. #strip函数会删除头和尾的字符,中间的不会删除  
17.         line = line.strip()  
18. #删除‘\t’字符,仅剩下数据,供使用  
19. '\t')  
20. #得到前三列数据,即飞行时间,游戏,冰激凌  
21. 0:3]  
22. #得到largeDoses,smallDoses,didntLike的label  
23. 1])      #无法将largeDoses,smallDoses,didntLike  
24. #转换为int。基于这个思想,我们在这里将得到的行矩阵建立  
25. #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改  
26. if classLabelVector[index] == 'largeDoses':  
27. 3)  
28. elif classLabelVector[index] == 'smallDoses':  
29. 2)  
30. else:  
31. 1)  
32. 1  
33. return returnMat, classLabelVector_Value

然后是能运行的整个kNN.py

[python] 


1. #批量注释、批量取消注释 Ctrl+/  
2. # from __future__ import print_function  
3. from  numpy import *  
4. import operator#运算符模块  
5.   
6. def createDataSet():  
7. 1.0,1.1],[1.0,1.0],[0,0],[0, 0.1]])  
8. 'A','A','B','B']  
9. return group,labels  
10.   
11. group,labels=createDataSet()  
12.   
13. def classify0(inX, dataSet, labels, k): #inX: 待测试数据 ;  dataSet: 训练样本集  
14. 0]      #to get the rows of the matrix  
15. # to get the Xi-Yi of the dataSet  
16. 1)) - dataSet      #a=[1 2],b=[2 3];tile(a,b) to generate 2*3 matrix when  
17. #the element all is a [1 2]  
18. 2  
19. 1)         #使每行的元素相加,得到测试样本与各训练样本distance**2  
20. #axis=0,按列相加;axis=1,按行相加;  
21. 0.5  
22. #将distance中的元素从小到大排列,  
23. # 提取其对应的index(索引),然后输出到 sortedDistIndicies  
24. #声明一个dict:{key:value1,key2:value2}  
25.     classCount={}  
26. for i in range(k):  
27.         voteIlabel = labels[sortedDistIndicies[i]]  
28. #classCount= {'B': 2, 'A': 1},初始化后,classCount每得到一个相同的voteIlabel,就+1  
29. 0) + 1       #当我们获取字典里的值的时候,一个是通过  
30. # 键值对,即dict['key'],另一个就是dict.get()方法  
31. # dict.get(voteIlabel,0) = 0, 此处0 to be initiated,  
32. #  之后就没有作用了。  
33. #items方法是可以将字典中的所有项,以列表方式返回。 iteritems方法与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器  
34. #Python3 中没有iteritems函数,需要用values()代替,并用list转为列表  
35. # sortedClassCount = sorted((key_label, value_num), key=operator.itemgetter(1), reverse=True)  
36. #python3中无法使用iteritems,需要对上面这句话改造,我们通过得到两个list,得到出现频率最高的label  
37.     key_label=list(classCount.keys())  
38.     value_num=list(classCount.values())  
39. #label出现频率由小到大排列,并返回索引index  
40.     sortedvalue_num_indicies = argsort(value_num)  
41. #返回频率最大的label  
42. return key_label[len(sortedvalue_num_indicies)-1]  
43.   
44. # group,labels = createDataSet()  
45. # a=classify0([0,0], group,labels,3)  
46. # print(a)  
47.   
48. def file2matrix(filename):  
49. #open a file, default: 'r'ead  
50.     fr = open(filename)  
51. #一次读取所有行  
52.     arrayOLines = fr.readlines()  
53. #得到行数  
54.     numberOfLines = len(arrayOLines)  
55. #1000*3 zeros matrix,row-1000, column-3  
56. 3))  
57. #声明  
58.     classLabelVector = []  
59.     classLabelVector_Value = []  
60. 0  
61. #逐行扫描  
62. for line in arrayOLines:  
63. #strip函数会删除头和尾的字符,中间的不会删除  
64.         line = line.strip()  
65. #删除‘\t’字符,仅剩下数据,供使用  
66. '\t')  
67. #得到前三列数据,即飞行时间,游戏,冰激凌  
68. 0:3]  
69. #得到largeDoses,smallDoses,didntLike的label  
70. 1])      #无法将largeDoses,smallDoses,didntLike  
71. #转换为int。基于这个思想,我们在这里将得到的行矩阵建立  
72. #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改  
73. if classLabelVector[index] == 'largeDoses':  
74. 3)  
75. elif classLabelVector[index] == 'smallDoses':  
76. 2)  
77. else:  
78. 1)  
79. 1  
80. return returnMat, classLabelVector_Value


Pycharm同一工程中再输入一下代码,可以进行验证:


[html]

1. datingDataMat,datingLabels = file2matrix('datingTestSet.txt')  
2. print(datingDataMat)  
3. print(datingLabels[0:20])


结束!


####################################################