程序清单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])
结束!
####################################################