文章结构
一、算法思想
二、代码及注解(代码来源于书中)
一、算法思想
K-近邻算法是一种分类方法,其基本思想是:给定一堆 样本(特征) - 标签 数据集,对于新的只有特征的测试样本,选择有标签数据集中与测试样本距离最近的K个样本,然后取这K个样本中样本数量最多的标签作为测试样本的标签。
二、代码及注解(代码来源于书中)
2.1 kNN算法
def classify0(inX,dataset,labels,k): #inX:用于分类的输入向量 dataSetSize = dataSet.shape[0] #样本数据集的大小(个数),一行表示一个样本,不同列表示不同特征 diffMat = tile(inX,(dataSetSize,1)) - dataset #将待测试样本复制,复制后的矩阵行列等于训练样本集,这样利用矩阵减法运算 sqDiffMat = diffMat ** 2 #特征差值的平方 sqDistances = sqDiffMat.sum(axis=1) #对特征差值的平方求和 distances = sqDistances ** 0.5 sortedDisrIndicies = distances.argsort() #按距离从小到大的是顺序排列,输出结果距离数据值对应的索引 classCount = {} #用来存储前k个样本的索引和标签 for i in range(k): voteIlabel = labels[sortedDisrIndicies[i]] #找到上上面索引列表对应的标签 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #如果classCount中有索引对应的标签,则该标签(字典键)对应的值+1 sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True) #iteritems用于生成列表从而排序;itemgetter(1) 表示对列表按第1th属性排序;降序(某个标签个数)排列 return sortedClassCount[0][0] #返回数量最多的标签
2.1.1 函数
(1)tile() 复制函数
函数格式tile(A,reps) // A待复制矩阵 ;reps:复制格式
(2)sum(axis=1) //按第1轴求和(按列)
sum(sxis=0) //按第0轴求和(按行)
(3)argsort(x) //将X中的元素从小到大排列,并返回元素对应的索引值
argsort(-x) //将X中的元素从大到小排列,并返回元素对应的索引
(4)dict.get(key, default=None) //返回元胞键对应的值,如果元胞中没有相应的键,则返回默认值
(5)iteritems //将字典以列表的形式输出