机器学习实战笔记二_Python3

程序清单2-2 

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

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

[python]  view plain  copy
  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.     returnMat = zeros((numberOfLines,3))  
  10.     #声明  
  11.     classLabelVector = []  
  12.     classLabelVector_Value = []  
  13.     index = 0  
  14.     #逐行扫描  
  15.     for line in arrayOLines:  
  16.         #strip函数会删除头和尾的字符,中间的不会删除  
  17.         line = line.strip()  
  18.         #删除‘\t’字符,仅剩下数据,供使用  
  19.         listFromLine = line.split('\t')  
  20.         #得到前三列数据,即飞行时间,游戏,冰激凌  
  21.         returnMat[index, :] = listFromLine[0:3]  
  22.         #得到largeDoses,smallDoses,didntLike的label  
  23.         classLabelVector.append(listFromLine[-1])      #无法将largeDoses,smallDoses,didntLike  
  24.                                                        #转换为int。基于这个思想,我们在这里将得到的行矩阵建立  
  25.                                                        #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改  
  26.         if classLabelVector[index] == 'largeDoses':  
  27.             classLabelVector_Value.append(3)  
  28.         elif classLabelVector[index] == 'smallDoses':  
  29.             classLabelVector_Value.append(2)  
  30.         else:  
  31.             classLabelVector_Value.append(1)  
  32.         index += 1  
  33.     return returnMat, classLabelVector_Value  

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

[python]  view plain  copy
  1. #批量注释、批量取消注释 Ctrl+/  
  2. # from __future__ import print_function  
  3. from  numpy import *  
  4. import operator#运算符模块  
  5.   
  6. def createDataSet():  
  7.     group = array([[1.0,1.1],[1.0,1.0],[0,0],[00.1]])  
  8.     labels = ['A','A','B','B']  
  9.     return group,labels  
  10.   
  11. group,labels=createDataSet()  
  12.   
  13. def classify0(inX, dataSet, labels, k): #inX: 待测试数据 ;  dataSet: 训练样本集  
  14.     dataSetSize = dataSet.shape[0]      #to get the rows of the matrix  
  15.     # to get the Xi-Yi of the dataSet  
  16.     diffMat = tile(inX, (dataSetSize,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.     sqDiffMat = diffMat**2  
  19.     sqDistances = sqDiffMat.sum(axis=1)         #使每行的元素相加,得到测试样本与各训练样本distance**2  
  20.                                                 #axis=0,按列相加;axis=1,按行相加;  
  21.     distances = sqDistances**0.5  
  22.     sortedDistIndicies = distances.argsort()    #将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.         classCount[voteIlabel] = classCount.get(voteIlabel,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.     returnMat = zeros((numberOfLines,3))  
  57.     #声明  
  58.     classLabelVector = []  
  59.     classLabelVector_Value = []  
  60.     index = 0  
  61.     #逐行扫描  
  62.     for line in arrayOLines:  
  63.         #strip函数会删除头和尾的字符,中间的不会删除  
  64.         line = line.strip()  
  65.         #删除‘\t’字符,仅剩下数据,供使用  
  66.         listFromLine = line.split('\t')  
  67.         #得到前三列数据,即飞行时间,游戏,冰激凌  
  68.         returnMat[index, :] = listFromLine[0:3]  
  69.         #得到largeDoses,smallDoses,didntLike的label  
  70.         classLabelVector.append(listFromLine[-1])      #无法将largeDoses,smallDoses,didntLike  
  71.                                                        #转换为int。基于这个思想,我们在这里将得到的行矩阵建立  
  72.                                                        #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改  
  73.         if classLabelVector[index] == 'largeDoses':  
  74.             classLabelVector_Value.append(3)  
  75.         elif classLabelVector[index] == 'smallDoses':  
  76.             classLabelVector_Value.append(2)  
  77.         else:  
  78.             classLabelVector_Value.append(1)  
  79.         index += 1  
  80.     return returnMat, classLabelVector_Value  

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

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

结束!


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

转自:https://blog.csdn.net/shunquanlan9446/article/details/79748284

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值