""" k-近邻算法采用不同特征值之间的距离方法进行分类 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型与标称型 工作原理:存在一个数据集合,也称作训练数据集,并且样本集中每个数据都有标签,即我们知道样本集中每一数据与 所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法 提取样本集中特征最相似数据(最近邻)的分类标签。一般来书,我们只选择样本数据集中前k个最相似的数据,这就 是最近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据 的分类。 """ import numpy as np # 科学计算包 import operator # 运算符模块 def creatDataSet(): group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels """ KNN算法伪代码 (1)计算已知类别数据集中的点与当前点之间的距离 (2)按照距离递增顺序排序 (3)选取与当前点距离最小的K个点 (4)确定前K个点所在类别的出现频率 (5)返回前K个点出现频率最高的类别作为当前点的预测类别 """ def classify0(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] # shape:几行几列(元组) ,这里指数据的行数 # np.tile:将inX在列方向上重复1次,行向量上重复dataSetSize次 diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet sqDiffMat = diffMat ** 2 sqDistance = sqDiffMat.sum(axis=1) distance = sqDistance ** 0.5 # argsort: 用来返回数组值从小到大索引值(先排序,然后找其在原数组中的索引值) sortedDistIndicies = distance.argsort() classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] #dict.get(key, default=None) 返回指定键的值,如果指定键不存在,返回默认值None classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 对A或者B出现的次数进行技数 sortedClassCount = sorted(classCount.items(), key= operator.itemgetter(1), reverse= True) return sortedClassCount[0][0] group, labels = creatDataSet() a = classify0([0, 0], group, labels, 3)
print(a) # B
下面对程序中一些部分进行细致的学习
numpy.tile()
""" numpy.tile(A, (x,y)) A: array_alike x: 对A来说,在行方向上重复X次 y: 对A来说,在列方向上重复y次 """ import numpy as np arr = [1,2,3] arr1 = np.tile(arr, 2) # 如果只有一个的话,默认为列方向的 arr2 = np.tile(arr, (2, 3)) print('arr1: ',arr1) # [1 2 3 1 2 3] print('arr2: ',arr2) # n [[1 2 3 1 2 3 1 2 3], [1 2 3 1 2 3 1 2 3]]
argsort()
""" argsort: 用来返回数组值从小到大索引值(先排序,然后找其在原数组中的索引值) """ import numpy as np a = np.array([2, 6, 1, 5]) b = a.argsort() # a.sort() --> 1,2,5,6 print(a) #[[2,6,1,5]] print(b) #[2,0,3,1]
sort()
""" 排序有两种: 1:sort,在本地进行排序,不返回副本 2:sorted,返回副本,原始输入不变 sorted(iterable,cmp=None,key=None,reverse=False) iterable:可迭代类型 cmp:用于比较的函数,比较什么由key决定 key:用列表元素的某个属性或者函数作为关键字,有默认值,迭代集合中的一项 reverse:排序规则 """ # sortedClassCount = sorted(classCount.items(), key= operator.itemgetter(1), reverse= True) # operator.itemgetter(x) 获取对象x个域的值 import operator a = [1,2,3] b = operator.itemgetter(1) print(a) #[1,2,3] print(b) # operator.itemgetter(1) print(b(a)) # 2