机器学习实战:K-临近算法(2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lom9357bye/article/details/73033201

海伦一直在使用在线约会网站寻找合适自己的约会对象,经过一番总结,海伦整理了以下数据,希望我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中

1、收集数据


 
 
  1. 40920 8.326976 0.953952 largeDoses
  2. 14488 7.153469 1.673904 smallDoses
  3. 26052 1.441871 0.805124 didntLike
  4. 75136 13.147394 0.428964 didntLike
  5. 38344 1.669788 0.134296 didntLike
  6. 72993 10.141740 1.032955 didntLike
  7. 35948 6.830792 1.213192 largeDoses
  8. 42666 13.276369 0.543880 largeDoses
  9. 67497 8.631577 0.749278 didntLike
  10. 35483 12.273169 1.508053 largeDoses
  11. 50242 3.723498 0.831917 didntLike
  12. 63275 8.385879 1.669485 didntLike
  13. 5569 4.875435 0.728658 smallDoses
  14. 51052 4.680098 0.625224 didntLike
  15. 77372 15.299570 0.331351 didntLike
  16. 43673 1.889461 0.191283 didntLike
  17. 61364 7.516754 1.269164 didntLike
  18. 69673 14.239195 0.261333 didntLike
  19. ......

第一列:每年获得的飞行常客里程数

第二列:玩视频游戏所耗时间百分比

第三列:每周消费的冰淇淋公升数

第四列:海伦对数据的分类

largeDoses表示对海伦极具魅力的人

smallDoses表示对海伦魅力一般的人

didntlike表示海伦不喜欢的人


2、准备数据

(1)首先将分类的标签转为数字

largeDoses:用3表示

smallDoses:用2表示

didntlike:用1表示

新的数据如下:


 
 
  1. 40920 8.326976 0.953952 3
  2. 14488 7.153469 1.673904 2
  3. 26052 1.441871 0.805124 1
  4. 75136 13.147394 0.428964 1
  5. 38344 1.669788 0.134296 1
  6. 72993 10.141740 1.032955 1
  7. 35948 6.830792 1.213192 3
  8. 42666 13.276369 0.543880 3
  9. 67497 8.631577 0.749278 1
  10. 35483 12.273169 1.508053 3
  11. 50242 3.723498 0.831917 1
  12. 63275 8.385879 1.669485 1
  13. 5569 4.875435 0.728658 2
  14. 51052 4.680098 0.625224 1
  15. 77372 15.299570 0.331351 1
  16. 43673 1.889461 0.191283 1
  17. 61364 7.516754 1.269164 1
  18. 69673 14.239195 0.261333 1
  19. ......

(2)用Python读取文件,将文件中的内容转为矩阵


 
 
  1. #将文件转为矩阵
  2. def file2matrix(filename):
  3. fr=open(filename) #打开文件
  4. arrayOLines=fr.readlines() #读取整个文件,分析成一个行的列表
  5. numberOfLines=len(arrayOLines) #文件行数
  6. returnMat=zeros((numberOfLines, 3)) #创建len行3列的矩阵
  7. classLabelVector=[] #定义存储标签的对象
  8. index= 0
  9. #遍历文件每一行
  10. for line in arrayOLines:
  11. line=line.strip() #截取掉回车字符
  12. listFromLine=line.split( '\t') #根据\t tab将一行的内容分割
  13. returnMat[index,:] = listFromLine[ 0: 3] #选取分割后的前三个元素,returnMat[index,:]表示取得第index行的所有元素
  14. classLabelVector.append(int(listFromLine[ -1])) #向标签列表中添加该条数据对应的分类
  15. index += 1
  16. return returnMat,classLabelVector
  17. data,label=file2matrix( 'datingTestSet2.txt')
  18. print(data)
  19. print(label)
测试:


 
 
  1. [[ 4.09200000e+04 8.32697600e+00 9.53952000e-01]
  2. [ 1.44880000e+04 7.15346900e+00 1.67390400e+00]
  3. [ 2.60520000e+04 1.44187100e+00 8.05124000e-01]
  4. ...,
  5. [ 2.65750000e+04 1.06501020e+01 8.66627000e-01]
  6. [ 4.81110000e+04 9.13452800e+00 7.28045000e-01]
  7. [ 4.37570000e+04 7.88260100e+00 1.33244600e+00]]
  8. [ 3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 2, 1, 2, 3, 2, 3, 2, 3, 2, 1, 3, 1, 3, 1, 2, 1, 1, 2, 3, 3, 1, 2, 3, 3, 3, 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, 2, 2, 3, 1, 2, 1, 2, 2, 2, 2, 2, 3, 2, 3, 1, 2, 3, 2, 2, 1, 3, 1, 1, 3, 3, 1, 2, 3, 1, 3, 1, 2, 2, 1, 1, 3, 3, 1, 2, 1, 3, 3, 2, 1, 1, 3, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 2, 1, 3, 1, 2, 1, 1, 2, 3, 2, 3, 2, 3, 2, 1, 3, 3, 3, 1, 3, 2, 2, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 3, 2, 3, 3, 1, 2, 3, 2, 2, 3, 3, 3, 1, 2, 2, 1, 1, 3, 2, 3, 3, 1, 2, 1, 3, 1, 2, 3, 2, 3, 1, 1, 1, 3, 2, 3, 1, 3, 2, 1, 3, 2, 2, 3, 2, 3, 2, 1, 1, 3, 1, 3, 2, 2, 2, 3, 2, 2, 1, 2, 2, 3, 1, 3, 3, 2, 1, 1, 1, 2, 1, 3, 3, 3, 3, 2, 1, 1, 1, 2, 3, 2, 1, 3, 1, 3, 2, 2, 3, 1, 3, 1, 1, 2, 1, 2, 2, 1, 3, 1, 3, 2, 3, 1, 2, 3, 1, 1, 1, 1, 2, 3, 2, 2, 3, 1, 2, 1, 1, 1, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 3, 2, 3, 3, 3, 3, 1, 2, 3, 1, 1, 1, 3, 1, 3, 2, 2, 1, 3, 1, 3, 2, 2, 1, 2, 2, 3, 1, 3, 2, 1, 1, 3, 3, 2, 3, 3, 2, 3, 1, 3, 1, 3, 3, 1, 3, 2, 1, 3, 1, 3, 2, 1, 2, 2, 1, 3, 1, 1, 3, 3, 2, 2, 3, 1, 2, 3, 3, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 3, 2, 1, 1, 3, 3, 3, 2, 3, 2, 1, 1, 1, 1, 1, 3, 2, 2, 1, 2, 1, 3, 2, 1, 3, 2, 1, 3, 1, 1, 3, 3, 3, 3, 2, 1, 1, 2, 1, 3, 3, 2, 1, 2, 3, 2, 1, 2, 2, 2, 1, 1, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 3, 1, 1, 2, 2, 1, 2, 2, 2, 3, 1, 1, 1, 3, 1, 3, 1, 3, 3, 1, 1, 1, 3, 2, 3, 3, 2, 2, 1, 1, 1, 2, 1, 2, 2, 3, 3, 3, 1, 1, 3, 3, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 1, 1, 1, 1, 3, 3, 3, 3, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 3, 2, 1, 3, 2, 3, 2, 3, 2, 1, 1, 2, 3, 1, 3, 3, 3, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 3, 2, 1, 3, 3, 2, 2, 2, 3, 1, 2, 1, 1, 3, 2, 3, 2, 3, 2, 3, 3, 2, 2, 1, 3, 1, 2, 1, 3, 1, 1, 1, 3, 1, 1, 3, 3, 2, 2, 1, 3, 1, 1, 3, 2, 3, 1, 1, 3, 1, 3, 3, 1, 2, 3, 1, 3, 1, 1, 2, 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 3, 1, 1, 2, 2, 2, 3, 2, 2, 1, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 1, 3, 2, 3, 2, 1, 2, 1, 1, 1, 2, 3, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 2, 2, 3, 3, 1, 2, 2, 2, 3, 1, 2, 1, 3, 1, 2, 3, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 2, 2, 3, 1, 3, 1, 2, 3, 2, 2, 3, 1, 2, 3, 2, 3, 1, 2, 2, 3, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 3, 2, 1, 3, 3, 3, 1, 1, 3, 1, 2, 3, 3, 2, 2, 2, 1, 2, 3, 2, 2, 3, 2, 2, 2, 3, 3, 2, 1, 3, 2, 1, 3, 3, 1, 2, 3, 2, 1, 3, 3, 3, 1, 2, 2, 2, 3, 2, 3, 3, 1, 2, 1, 1, 2, 1, 3, 1, 2, 2, 1, 3, 2, 1, 3, 3, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 1, 3, 3, 1, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 3, 2, 2, 1, 3, 1, 2, 3, 1, 3, 1, 3, 1, 1, 3, 2, 3, 1, 1, 3, 3, 3, 3, 1, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 1, 2, 1, 2, 1, 3, 2, 1, 2, 2, 3, 1, 2, 2, 2, 3, 2, 1, 2, 1, 2, 3, 3, 2, 3, 1, 1, 3, 3, 1, 2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 1, 1, 3, 2, 1, 2, 1, 2, 2, 3, 2, 2, 2, 3, 1, 2, 1, 2, 2, 1, 1, 2, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 2, 3, 3, 2, 2, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 3, 2, 2, 1, 3, 1, 2, 3, 1, 2, 2, 2, 2, 3, 2, 3, 3, 1, 2, 1, 2, 3, 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3]


3、分析数据

(1)使用Matplotlib创建散点图

         导入matplotlib


 
 
  1. # -*- coding:utf-8 -*-
  2. from numpy import *
  3. import operator
  4. import matplotlib
  5. import matplotlib.pyplot as plt
  6. #将文件转为矩阵
  7. def file2matrix(filename):
  8. fr=open(filename) #打开文件
  9. arrayOLines=fr.readlines() #读取整个文件,分析成一个行的列表
  10. numberOfLines=len(arrayOLines) #文件行数
  11. returnMat=zeros((numberOfLines, 3)) #创建len行3列的矩阵
  12. classLabelVector=[] #定义存储标签的对象
  13. index= 0
  14. #遍历文件每一行
  15. for line in arrayOLines:
  16. line=line.strip() #截取掉回车字符
  17. listFromLine=line.split( '\t') #根据\t tab将一行的内容分割
  18. returnMat[index,:] = listFromLine[ 0: 3] #选取分割后的前三个元素,returnMat[index,:]表示取得第index行的所有元素
  19. classLabelVector.append(int(listFromLine[ -1])) #向标签列表中添加该条数据对应的分类
  20. index += 1
  21. return returnMat,classLabelVector
  22. data,label=file2matrix( 'datingTestSet2.txt')
  23. #画散点图
  24. fig=plt.figure()
  25. ax=fig.add_subplot( 111)
  26. ax.scatter(data[:, 1],data[:, 2]) #选择数据集的第二列(玩游戏所占时间比)的值作为x轴,第三列(冰淇淋公升数)的值作为y轴
  27. plt.show() #显示散点图



从散点图上看不出什么有用的信息,所以我们来改一下程序:


 
 
  1. #第一个参数:选择数据集的第二列(玩游戏所占时间比)的值作为x轴
  2. #第二个参数:第三列(冰淇淋公升数)的值作为y轴
  3. #第三个参数和第四个参数:代表颜色和大小同时放大15倍,这时,同一类标签颜色和大小相同
  4. ax.scatter(data[:, 1],data[:, 2], 15.0*array(label), 15.0*array(label))
参考: http://blog.csdn.net/abcjennifer/article/details/19848269

此时散点图:

从图中可以看出数据已经和对应的分类标签挂钩,基本上可以看到数据点所属三个样本分类的区域轮廓,绿色、黄色、重紫色(就这么叫吧)分别代表了不同的分类,同一分类下的点大小和颜色都相同。

下面将飞行常客旅行数作为x轴数据,玩视频游戏所耗时间百分比作为y轴数据来看一下散点图的情况:

此图清晰的标识了三个不同的样本分类区域,更容易区分数据点从属的类别。


4、归一化数值

(1)取一些样本数据

假如想计算样本三和样本4之间的距离,需要使用如下的方法:

从方程中很容易发现,数字差值最大的属性对计算结果影响最大,也就是飞行常客里程数对于计算结果的影响将远远大于玩视频游戏所占时间比和每周消费冰淇淋公升数这两个特征,原因是飞行常客旅程数的数值远大于其他特征值的值,但是海伦认为这三种特征是同等重要的,飞行常客里程数不应该如此严重的影响到计算结果。

处理这种不同取值范围的特征值时,通常采用的办法是将数值归一化,比如将数值的范围处理为0到1之间的值。下面的公式可以将取值范围转换到0和1之间:

newValue=(oldValue-min)/(max-min)

max:数据集中最大特征值

min:数据集中最小特征值

下面定义一个函数,对数据进行归一化处理:


 
 
  1. #归一化
  2. def autoNorm(dataSet):
  3. minVals=dataSet.min( 0) #获取每一列的最小值
  4. maxVals=dataSet.max( 0) #获取每一列的最大值
  5. ranges=maxVals-minVals #max-min差值
  6. normDataSet=zeros(shape(dataSet)) #zeros函数用来创建给定的矩阵类型,并初始化为0
  7. m=dataSet.shape[ 0] #获取数据集行数
  8. normDataSet=dataSet-tile(minVals,(m, 1)) #将minVals为变为m行的矩阵(oldValue-min)
  9. normDataSet=normDataSet/tile(ranges,(m, 1)) #将ranges变为m行的矩阵(oldValue-min)/(max-min)
  10. return normDataSet,ranges,minVals

每一列的最小值:minVals=[ 0.        0.        0.001156] 

每一列的最大值:maxVals=[  9.12730000e+04   2.09193490e+01   1.69551700e+00]

max-min对应的是ranges

由于minVals是一行三列的矩阵,为了便于相减,使用tile函数将minVals变为m行三列的矩阵,m为数据集的行数

同样的办法将ranges变为m行三列的矩阵,便于相除



机器学习实战代码下载:http://vdisk.weibo.com/s/uEZesAafcjQgx

来自:机器学习实战

Python知识参考:

http://blog.csdn.net/werm520/article/details/6898473


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值