在看机器学习实战时,kNN里面有段关于矩阵的处理,那简直666啊。。。
查了一下利用Python进行数据分析 ,发现里面没有详细提到此用法。故简单做一个总结:
具体代码如下:
import numpy as np
for i in range(numTestVecs): #前numTestVecs个数据作为测试集,后m-numTestVecs个数据作为训练集 classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m], 3) print("分类结果:%d\t真实类别:%d" % (classifierResult, datingLabels[i])) if classifierResult != datingLabels[i]: errorCount += 1.0
classify0方法里面的参数矩阵的意思
例如 testMat = np.array([ [1,2,3,4],
[5,6,7,8],
[9,9,0,0] ]) 或者用np.mat()
这是一个3*4的矩阵 testMat.shape[0] 返回行数3, testMat.shape[1] 返回列数4。
testMat[0, : ] 返回[1, 2, 3, 4], 表示返回的是第0行(下标0开始)的所有数据 (行向量)
testMat[0:2, : ] 返回的是 前两行[[1 2 3 4]
[5 6 7 8]] 表示第0行 和 第1行的所有数据,(下标0,1,不包含2。左闭右开区间),为一个2*4的矩阵。
同理,testMat[0:2, 1:3] 返回的是 [[2 3]
[6 7]],在上面的基础上取其第1,2列(下标0开始)
testMat[:, 1:3] 返回[ [2 3]
[6 7]
[9 0] ] 就是第1,2列(下标0开始)
故:
classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m], 3)
第一个参数是normMat矩阵的第i个行向量,第二个参数是此矩阵[numTestVecs, m]左闭右开区间的的所有行组成的矩阵
第三个参数是标签行向量datingLabels的[numTestVecs, m]左闭右开区间的的所有元素组成的新的行向量
第四个参数是kNN里面的k值,就是取前k个最近邻的距离做下一步对比。
(numpy中默认都是行向量,没有列向量)
综上:
Mat[:,0]就是取矩阵Mat的所有行的第0列的元素,
Mat[:,1] 就是取所有行的第1列的元素。
Mat[:, m:n]即取矩阵Mat的所有行中的的第m到n-1列数据,含左不含右。
Mat[0,:]就是取矩阵X的第0行的所有元素,
Mat[1,:]取矩阵X的第1行的所有元素。
np.sum( matirx )
a = np.mat([[1, 2, 3], [3, 2, 1]]) print(a)[[1 2 3]
[3 2 1]]
print(a.sum()) # 返回所有矩阵元素的和 此处返回12 print(a.sum(axis=0))
12
[[4 4 4]]
print(a.sum(axis=1))
[[6]
[6]]
print(np.sum(np.array([[1, 2, 3], [3, 2, 1]]), axis=0)) # axis=0 表示列相加,得到行向量
[4 4 4]
print(np.sum(np.array([[1, 2, 3], [3, 2, 1]]), axis=1)) # axis=1 表示行相加,得到列向量[6 6]