首先介绍knn算法用到的numpy的几个知识点:
1.shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。
举例说明:
建立一个4×2的矩阵c, c.shape[0] 为第一维的长度,c.shape[1] 为第二维的长度。
- >>> c = array([[1,1],[1,2],[1,3],[1,4]])
- >>> c.shape
- (4, 2)
- >>> c.shape[0]
- 4
- >>> c.shape[1]
- 2
2.python中numpy模块tile方法说明
函数形式: tile(A,rep)
功能:重复A的各个维度
参数类型:
- A: Array类的都可以
- rep:A沿着各个维度重复的次数
举例:
tile([1,2],2)
- 1
输出[1,2,1,2]
tile([1,2],(2,2))
- 1
重复顺序为: [1,2] => [[1,2] , [1,2]] => [[1,2,1,2] , [1,2,1,2]]
tile([1,2],(2,2,3))
- 1
重复顺序为: [1,2] => [[1,2] , [1,2]] => [[[1,2],[1,2]] , [[1,2],[1,2]]] => [[[1,2,1,2,1,2],[1,2,1,2,1,2]] , [[1,2,1,2,1,2],[1,2,1,2,1,2]]]
现在对于数据的处理更多的还是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,)
4.argsort()
argsort() 函数将数组的值从小到大排序后,并按照其相对应的索引值输出
举例说明:
一维数组
- >>> a = array([3,1,2])
- >>> argsort(a)
- array([1, 2, 0])
二维数组
- >>> b = array([[1,2],[2,3]])
- >>> argsort(b,axis=1) #按行排序
- array([[0, 1],
- [0, 1]])
- >>> argsort(b,axis=0) #按列排序
- array([[0, 0],
- [1, 1]])
- >>>
5.get方法
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
get()方法语法:
dict.get(key, default=None)
- key -- 字典中要查找的键。
- default -- 如果指定键的值不存在时,返回该默认值值,如果值不在字典中返回默认值None。
python字典中还存在items()方法。两者有些许区别。
items方法是可以将字典中的所有项,以列表方式返回。
iteritems方法与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。
- >>> d = {'1':'one', '2':'two', '3':'three'}
- >>> x = d.items()
- >>> x
- [('1', 'one'), ('3', 'three'), ('2', 'two')]
- >>> type(x)
- <type 'list'>
- >>> y = d.iteritems()
- >>> y
- <dictionary-itemiterator object at 0x025008A0>
- >>> type(y)
- <type 'dictionary-itemiterator'>
from numpy import *
import operator
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
lables = ['A', 'A', 'B', 'B']
return group, lables
def classify0(inX, dataSet, lables, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distances = sqDistance**0.5
sortedDistance = distances.argsort()
# 对距离进行排序,argsort()函数默认按升序排列,但只返回下标,不对原数组排序
classCount = {}
for i in range(k):
# 统计最近的 k 个点的类别出现的次数
votelable = lables[sortedDistance[i]]
classCount[votelable] = classCount.get(votelable, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse = True)
# 对类别出现的次数进行排序,sorted()函数默认升序
return sortedClassCount[0][0]
# 返回类别出现次数最多的分类名称
if __name__ == "__main__":
group, lables = createDataSet()
print('group is:')
print(group)
print('labels is:')
print(lables)
t = classify0([0, 0], group, lables, 3)
print('t is:')
print(t)
输出结果为:
group is:
[[ 1. 1.1]
[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.1]]
labels is:
['A', 'A', 'B', 'B']
t is:
B