Machine Learning in Action 之k-近邻算法(一)

tile函数    

    在看机器学习实战这本书时,遇到numpy.tile(A,B)函数,愣是没看懂怎么回事,装了numpy模块后,实验了几把,原来是这样子:

重复A,B次,这里的B可以时int类型也可以是远组类型。

[python]  view plain  copy
  1. >>> import numpy  
  2. >>> numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1次  
  3. array([0000000000])  
  4. >>> numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1次  
  5. array([[00]])  
  6. >>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次  
  7. array([[00],  
  8.        [00]])  
  9. >>> numpy.tile([0,0],(3,1))  
  10. array([[00],  
  11.        [00],  
  12.        [00]])  
  13. >>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次  
  14. array([[000000]])  
  15. >>> numpy.tile([0,0],(2,3))<span style="font-family: Arial, Helvetica, sans-serif;">#在列方向上重复[0,0]3次,行2次</span>  
  16. array([[000000],  

  1.        [000000]])  

python中的sum函数.sum(axis=1)

看起来挺简单的样子,但是在给sum函数中加入参数。sum(a,axis=0)或者是.sum(axis=1) 就有点不解了


在我实验以后发现 我们平时用的sum应该是默认的axis=0 就是普通的相加 (对不起,写的不好,看下面的


而当加入axis=1以后就是将一个矩阵的每一行向量相加


例如:

import numpy as np

np.sum([[0,1,2],[2,1,3]],axis=1)的结果就是:array([3,6])


希望可以帮到你 呵呵


Sorry,以前学习阶段写东西比较随意,现在补充完善一下:

1. python 自己的sum()

输入的参数首先是[]

[python]  view plain  copy
  1. >>> sum([0,1,2])  
  2. 3  
  3. >>> sum([0,1,2],3)  
  4. 6  
  5. >>> sum([0,1,2],[3,2,1])  
  6. Traceback (most recent call last):  
  7.   File "<stdin>", line 1in <module>  
  8. TypeError: can only concatenate list (not "int") to list  


2.python的 numpy当中

现在对于数据的处理更多的还是numpy。没有axis参数表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加

[python]  view plain  copy
  1. >>> import numpy as np  
  2. >>> a=np.sum([[0,1,2],[2,1,3]])  
  3. >>> a  
  4. 9  
  5. >>> a.shape  
  6. ()  
  7. >>> a=np.sum([[0,1,2],[2,1,3]],axis=0)  
  8. >>> a  
  9. array([225])  
  10. >>> a.shape  
  11. (3,)  
  12. >>> a=np.sum([[0,1,2],[2,1,3]],axis=1)  
  13. >>> a  
  14. array([36])  
  15. >>> a.shape  
  16. (2,)  

如何可视化数据

关于可视化:

《机器学习实战》书中的一个小错误,P22的datingTestSet.txt这个文件,根据网上的源代码,应该选择datingTestSet2.txt这个文件。主要的区别是最后的标签,作者原来使用字符串‘veryLike’作为标签,但是Python转换会出现ValueError: invalid literal for int() with base 10: 'largeDoses'的错误。所以改成后面的文件就可以了。后面直接用1 2 3 代表not like, general like, very like。这个错误一开始用百度查不到,改用Google(反向代理),第二个链接就是。哎。。。国内啊。。。

[python]  view plain  copy
  1. from numpy import *  
  2. import operator  
  3. #创建数据集  
  4. def createDataSet():  
  5.     group = array([[1.01.1], [1.01.0], [00], [00.1]])  
  6.     labels = ['A''A''B''B']  
  7.     return group, labels  
  8. #根据输入测试实例进行k-近邻分类  
  9. def classify0(inX, dataSet, labels, k):  
  10.     dataSetSize = dataSet.shape[0]  
  11.     diffMat = tile(inX, (dataSetSize, 1)) - dataSet  
  12.     sqDiffMat = diffMat ** 2  
  13.     sqDistances = sqDiffMat.sum(axis=1)  
  14.     distances = sqDistances**0.5  
  15.     sortedDistIndicies = distances.argsort()  
  16.     classCount = {}  
  17.     for i in range(k):  
  18.         voteIlabel = labels[sortedDistIndicies[i]]  
  19.         classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  
  20.     sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)  
  21.     return sortedClassCount[0][0]  
  22. #处理输入格式问题,从文件中读取数据  
  23. def file2matrix(filename, dim2):  
  24.     fr = open(filename)  
  25.     arrayOLines = fr.readlines()  
  26.     numberOfLines = len(arrayOLines)  
  27.     returnMat = zeros((numberOfLines, dim2))  
  28.     classLabelVector = []  
  29.     index = 0  
  30.     for line in arrayOLines:  
  31.         line = line.strip()  
  32.         listFromLine = line.split('\t')  
  33.         returnMat[index, :] = listFromLine[0:dim2]  
  34.         classLabelVector.append(int(listFromLine[-1]))  
  35.         index += 1  
  36.     return returnMat, classLabelVector  
[python]  view plain  copy
  1. >>>import kNN  
  2. >>> reload(kNN)  
  3. <module 'kNN' from 'kNN.pyc'>  
  4. >>> datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt'3)  

得到了约会网站的数据之后,我们可以可视化出来。

利用Matplotlib创建散点图,python(x, y)内嵌这个,直接import即可。

[python]  view plain  copy
  1. >>> mimport matplotlib.pyplot as plt  
  2. >>> fig = plt.figure()  
  3. >>> ax = fig.add_subplot(111) >>> ax.scatter(datingDataMat[:,1], datingDataMat[:,2])  
  4. >>> plt.show()  

 

这个是“玩视频游戏消耗时间比”和“每周所消费的冰淇淋公升数”的二维图。

需要不同的颜色来得到更好的可视化效果。

scatter函数的使用。

[python]  view plain  copy
  1. ax.scatter(datingDataMat[:,1], datingDataMat[:, 2], 15.0*array(datingLabels), 15.0*array(datingLabels))  

这句代码替换前面的对应代码,如果出现name 'array' is not defined ,请在前面加这句:

[python]  view plain  copy
  1. from numpy import *  
下面是青色,暗红色,黑色三种点,是利用了15 * datingLabels的1, 2, 3作为不同点的颜色和尺寸。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值