k-近邻算法(k-Nearest Neighbors,kNN)
工作原理:
knn算法属于监督类型算法。首先我们有样本训练集,知道每一条数据的分类。继而,我们输入没有分类的新数据,将新数据的每个特征与样本集中的对应项进行比较,提取样本集中最相思的数据,这样我们可以获得该数据的分类。一般来说,我们只选择样本集中前k个最相似的数据,通常k不大于20.最后,选择k个相似数据中出现最多的分类,作为新数据的分类,此为k近邻算法。
优点:
精度高,对异常数值不敏感,无数据输入假定。
缺点:计算复杂度高,空间复杂度高。无法给出任何数据的基础结构信息,因此我们也无法知晓平均
实例样本和典型实例样本具有什么特征
适用数据范围:数值型,标称型(numeric values,nominal values)
伪代码:
(1)计算样本数据集中的点与当前带分类数据的点之间的距离(计算相似程度)
(2)按照距离递增排序
(3)选取与当前距离最小的前K个点
(4)确定k个点所在类别的出现频率
(5)返回出现频率最高的类别作为预测分类
python代码:
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
#intX:待分类数据(向量),dataSet,labels:样本训练集,k
def classi0(intX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]#训练集大小
diffMat = tile(intX,(dataSetSize,1)) - dataSet#把待分类数据向量复制成与训练集等阶,对应项求差
sqDiffMat = diffMat**2#各项平方
sqDistances = sqDiffMat.sum(axis=1)#axis=1,将一个矩阵的每一行向量相加
distances = sqDistances**0.5#开方,求出距离
sortedDistIndicies = distances.argsort()#从小到大排序,返回数组的索引
classCount = {}
for i in range(k):#遍历前K个样本训练集
voteILabel = labels[sort