机器学习实践 第2章 K-近邻算法概述 笔记(一)

来源:互联网 发布:防骗数据库 编辑:程序博客网 时间:2024/05/29 16:17

K-近邻算法是十分适合入门的分类算法,其优点为精度高,对异常值不敏感,无数据输入假定。缺点为计算复杂度和空间复杂度较高,适用于数值型数据和标称型数据。机器学习实践一书中,提供了python的代码。

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



def classify0(inX,dataset,labels,k): #inX为输入向量,对应上述例子,应该为一个1行两列的矩阵。dataset对应上述的group,labels对应labels,k为与当前点距离最小的k个点
dataSetSize = dataSet.shape[0]#返回dataset的行数,也就是返回训练集中的样本数量
diffMat = tile (inX,(dataSetSize,1))-dataset#tile()为扩充数组的一个函数,此处的意思是构建一个数组,有dataSetSize行,1列,其值为inX,然后再与dataset相减
sqDiffMat=diffMat**2#做平方运算
sqDistances=sqDiffMat.sum(axis=1)#按列求和,即每行相加,当axis=0时为按行求和
distances = sqDistances**0.5  #我平时在计算距离时,一般采用一个for循环,逐个计算,书中这种方法,简单方便,直接完成全部运算,值得学习
sortedDistIndicies=distances.argsort()#返回升序排列时的序数值,eg,sortedDistIndicies[0]便是原数组中最小值所处的序数
classCount={}#建立字典
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]#返回最近的K个点的标签
clasCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #get(voteIlabel,0)+1的意思便是如果原字典中有voteIlabel的key,则取其值+1。若无,则取0,再加1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#对字典中的各项按照各标签的次数进行排序
return sortedClassCount[0][0]#返回出现次数最多的标签

0 0