kNN
kNN算法的原理很简单,就是将新数据的特征与样本集中相应的特征进行比较,然后提取将样本集中特征最相似的数据的分类标签作为新数据的标签,一般的,只选取数据集中前k个最相似的元素,因此该算法被称为kNN,通常k取不大于20的整数。
下面看书上给出的实例:
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
group,labels=createdataset()
def classify(inx,dataset,labels,k):
datasetsize=dataset.shape[0]
diffmat=tile(inx,(datasetsize,1)) - dataset
sqdiffmat=diffmat**2
sqdistance=sqdiffmat.sum(axis=1)
distance=sqdistance**0.5 #计算距离,也就是比较特征
sorteddist=distance.argsort()
classcount={
}
for i in range(k):
votelabel=labels[sorteddist[i]]
classcount[votelabel]=classcount.get(votelabel,0)+1 #为字典classcount创建前k个最近的数据的标签对应出现次数的键值对
sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
return sortedclasscount[0][0]
print(classify([0,0],group,labels,3))
首先,定义了一个createdataset()函数用来生成数据样本集,然后定义的classify()函数有4个输人参数:用于分类的输人向量是inx,输入的训练样本集为dataset, 标签向量为labels 最后的参数k表示用于选择最近邻居的数目其中标签向量的元素数目和矩 阵如dataset的行数相同。
dataset.shape[0]返回dataset数组的第二维,也就是二维数组的行数,此例中为4,接下来的tile函数将inx数组的第二维重复了四次,第一维重复一次,也就是将inx数组从一行变成了4行,每一行都是原来的inx数组,这样就与dataset数组的行列数是一样的,用于接下来计算inx与每个数据样本的距离,这里的sqdiffmat.sum(axis=1)表示每一行的数组求和,这里返回一个长度为4的一维数组,每一个元素都是sqdiffmat对应一行的和,下面的argsort()函数将distance中的元素从小到大排列,提取其对应的index(索引),然后输出到sorteddist。
然后创建了一个空字典classcount,在接下来的for循环中为字典classcount创建了前k个最近的数据的标签对应出现次数的键值对
接下来有一个sorted函数,它的语法如下:
sorted(iterable, key=None, reverse=False)
iterable – 可迭代对象。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
items函数返回字典中可遍历的(键, 值) 元组数组。
operator.itemgetter函数的作用是获取对象哪些维的数据,参数是表示维的序号。
在这个例子中这个sorted函数的作用就是对字典classcount所生成的元组数组按照标签对应出现的次数进行降序排序,最后整个classify函数返回的sortedclasscount[0][0]就是出现次数最多的标签,以此作为待划分数据的分类标签。最后运行结果为 b 。
决策树
决策树伪代码如下:
检测数据集中的每个子项是否属于同一分类:
If so return 类标签;
Else