程序清单2-2
个人程序注释+Python3 部分代码改造(针对int(listFromLine[-1])编译不通过的调整)
先贴2-2的伪代码函数:
- def file2matrix(filename):
- #open a file, default: 'r'ead
- fr = open(filename)
- #一次读取所有行
- arrayOLines = fr.readlines()
- #得到行数
- numberOfLines = len(arrayOLines)
- #1000*3 zeros matrix,row-1000, column-3
- returnMat = zeros((numberOfLines,3))
- #声明
- classLabelVector = []
- classLabelVector_Value = []
- index = 0
- #逐行扫描
- for line in arrayOLines:
- #strip函数会删除头和尾的字符,中间的不会删除
- line = line.strip()
- #删除‘\t’字符,仅剩下数据,供使用
- listFromLine = line.split('\t')
- #得到前三列数据,即飞行时间,游戏,冰激凌
- returnMat[index, :] = listFromLine[0:3]
- #得到largeDoses,smallDoses,didntLike的label
- classLabelVector.append(listFromLine[-1]) #无法将largeDoses,smallDoses,didntLike
- #转换为int。基于这个思想,我们在这里将得到的行矩阵建立
- #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改
- if classLabelVector[index] == 'largeDoses':
- classLabelVector_Value.append(3)
- elif classLabelVector[index] == 'smallDoses':
- classLabelVector_Value.append(2)
- else:
- classLabelVector_Value.append(1)
- index += 1
- return returnMat, classLabelVector_Value
然后是能运行的整个kNN.py
- #批量注释、批量取消注释 Ctrl+/
- # from __future__ import print_function
- from numpy import *
- import operator#运算符模块
- def createDataSet():
- group = array([[1.0,1.1],[1.0,1.0],[0,0],[0, 0.1]])
- labels = ['A','A','B','B']
- return group,labels
- group,labels=createDataSet()
- def classify0(inX, dataSet, labels, k): #inX: 待测试数据 ; dataSet: 训练样本集
- dataSetSize = dataSet.shape[0] #to get the rows of the matrix
- # to get the Xi-Yi of the dataSet
- diffMat = tile(inX, (dataSetSize,1)) - dataSet #a=[1 2],b=[2 3];tile(a,b) to generate 2*3 matrix when
- #the element all is a [1 2]
- sqDiffMat = diffMat**2
- sqDistances = sqDiffMat.sum(axis=1) #使每行的元素相加,得到测试样本与各训练样本distance**2
- #axis=0,按列相加;axis=1,按行相加;
- distances = sqDistances**0.5
- sortedDistIndicies = distances.argsort() #将distance中的元素从小到大排列,
- # 提取其对应的index(索引),然后输出到 sortedDistIndicies
- #声明一个dict:{key:value1,key2:value2}
- classCount={}
- for i in range(k):
- voteIlabel = labels[sortedDistIndicies[i]]
- #classCount= {'B': 2, 'A': 1},初始化后,classCount每得到一个相同的voteIlabel,就+1
- classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #当我们获取字典里的值的时候,一个是通过
- # 键值对,即dict['key'],另一个就是dict.get()方法
- # dict.get(voteIlabel,0) = 0, 此处0 to be initiated,
- # 之后就没有作用了。
- #items方法是可以将字典中的所有项,以列表方式返回。 iteritems方法与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器
- #Python3 中没有iteritems函数,需要用values()代替,并用list转为列表
- # sortedClassCount = sorted((key_label, value_num), key=operator.itemgetter(1), reverse=True)
- #python3中无法使用iteritems,需要对上面这句话改造,我们通过得到两个list,得到出现频率最高的label
- key_label=list(classCount.keys())
- value_num=list(classCount.values())
- #label出现频率由小到大排列,并返回索引index
- sortedvalue_num_indicies = argsort(value_num)
- #返回频率最大的label
- return key_label[len(sortedvalue_num_indicies)-1]
- # group,labels = createDataSet()
- # a=classify0([0,0], group,labels,3)
- # print(a)
- def file2matrix(filename):
- #open a file, default: 'r'ead
- fr = open(filename)
- #一次读取所有行
- arrayOLines = fr.readlines()
- #得到行数
- numberOfLines = len(arrayOLines)
- #1000*3 zeros matrix,row-1000, column-3
- returnMat = zeros((numberOfLines,3))
- #声明
- classLabelVector = []
- classLabelVector_Value = []
- index = 0
- #逐行扫描
- for line in arrayOLines:
- #strip函数会删除头和尾的字符,中间的不会删除
- line = line.strip()
- #删除‘\t’字符,仅剩下数据,供使用
- listFromLine = line.split('\t')
- #得到前三列数据,即飞行时间,游戏,冰激凌
- returnMat[index, :] = listFromLine[0:3]
- #得到largeDoses,smallDoses,didntLike的label
- classLabelVector.append(listFromLine[-1]) #无法将largeDoses,smallDoses,didntLike
- #转换为int。基于这个思想,我们在这里将得到的行矩阵建立
- #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改
- if classLabelVector[index] == 'largeDoses':
- classLabelVector_Value.append(3)
- elif classLabelVector[index] == 'smallDoses':
- classLabelVector_Value.append(2)
- else:
- classLabelVector_Value.append(1)
- index += 1
- return returnMat, classLabelVector_Value
Pycharm同一工程中再输入一下代码,可以进行验证:
- datingDataMat,datingLabels = file2matrix('datingTestSet.txt')
- print(datingDataMat)
- print(datingLabels[0:20])
结束!
####################################################
转自:https://blog.youkuaiyun.com/shunquanlan9446/article/details/79748284