Machine Learning in Action 之k-近邻算法(一)
tile函数
在看机器学习实战这本书时,遇到numpy.tile(A,B)函数,愣是没看懂怎么回事,装了numpy模块后,实验了几把,原来是这样子:
重复A,B次,这里的B可以时int类型也可以是远组类型。
- >>> import numpy
- >>> numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1次
- array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
- >>> numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1次
- array([[0, 0]])
- >>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次
- array([[0, 0],
- [0, 0]])
- >>> numpy.tile([0,0],(3,1))
- array([[0, 0],
- [0, 0],
- [0, 0]])
- >>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次
- array([[0, 0, 0, 0, 0, 0]])
- >>> numpy.tile([0,0],(2,3))<span style="font-family: Arial, Helvetica, sans-serif;">#在列方向上重复[0,0]3次,行2次</span>
- array([[0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0]])
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()
输入的参数首先是[]
- >>> sum([0,1,2])
- 3
- >>> sum([0,1,2],3)
- 6
- >>> sum([0,1,2],[3,2,1])
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: can only concatenate list (not "int") to list
2.python的 numpy当中
现在对于数据的处理更多的还是numpy。没有axis参数表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加
- >>> import numpy as np
- >>> a=np.sum([[0,1,2],[2,1,3]])
- >>> a
- 9
- >>> a.shape
- ()
- >>> a=np.sum([[0,1,2],[2,1,3]],axis=0)
- >>> a
- array([2, 2, 5])
- >>> a.shape
- (3,)
- >>> a=np.sum([[0,1,2],[2,1,3]],axis=1)
- >>> a
- array([3, 6])
- >>> a.shape
- (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(反向代理),第二个链接就是。哎。。。国内啊。。。
- 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
- #根据输入测试实例进行k-近邻分类
- def classify0(inX, dataSet, labels, k):
- dataSetSize = dataSet.shape[0]
- diffMat = tile(inX, (dataSetSize, 1)) - dataSet
- sqDiffMat = diffMat ** 2
- sqDistances = sqDiffMat.sum(axis=1)
- distances = sqDistances**0.5
- sortedDistIndicies = distances.argsort()
- classCount = {}
- for i in range(k):
- voteIlabel = labels[sortedDistIndicies[i]]
- classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
- sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)
- return sortedClassCount[0][0]
- #处理输入格式问题,从文件中读取数据
- def file2matrix(filename, dim2):
- fr = open(filename)
- arrayOLines = fr.readlines()
- numberOfLines = len(arrayOLines)
- returnMat = zeros((numberOfLines, dim2))
- classLabelVector = []
- index = 0
- for line in arrayOLines:
- line = line.strip()
- listFromLine = line.split('\t')
- returnMat[index, :] = listFromLine[0:dim2]
- classLabelVector.append(int(listFromLine[-1]))
- index += 1
- return returnMat, classLabelVector
- >>>import kNN
- >>> reload(kNN)
- <module 'kNN' from 'kNN.pyc'>
- >>> datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt', 3)
得到了约会网站的数据之后,我们可以可视化出来。
利用Matplotlib创建散点图,python(x, y)内嵌这个,直接import即可。
- >>> mimport matplotlib.pyplot as plt
- >>> fig = plt.figure()
- >>> ax = fig.add_subplot(111) >>> ax.scatter(datingDataMat[:,1], datingDataMat[:,2])
- >>> plt.show()
这个是“玩视频游戏消耗时间比”和“每周所消费的冰淇淋公升数”的二维图。
需要不同的颜色来得到更好的可视化效果。
scatter函数的使用。
- ax.scatter(datingDataMat[:,1], datingDataMat[:, 2], 15.0*array(datingLabels), 15.0*array(datingLabels))
这句代码替换前面的对应代码,如果出现name 'array' is not defined ,请在前面加这句:
- from numpy import *