算法概述:
简单来说,KNN通过测量不同特征值之间的距离进行分类。KNN不需要训练模型,其输入是带标签的特征数据集,每一个数据是由其不同的属性构成的向量。对于未知标签的待分类数据,将其特征与训练数据集中的每一个数据进行相似性度量,然后获得最相近的K个特征数据的标签,其中出现最多的标签作为待分类数据的可能标签。
算法思路:
1)计算已知类别数据集中的点与当前点之间的距离;
2)按照距离递增次序排序;
3)选取与当前点距离最小的k个点;
4)确定前k个点所在类别的出现频率;
5)返回前k个点出现频率最高的类型作为当前点的预测分类;
算法程序:
def classify(inX, dataSet, labels, k):##inX:待分类数据,dataSet:训练数据, labels:训练数据标签, k:最近邻数据个数
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet;
sqDiffMat = diffMat**2;
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5;
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(),
key = operator.itemgetter(1), reverse = True)
return sortedClassCount[0][0]
算法存在的问题:
1)无法scale到大数据集上,时间和空间要求都很高;
2)不能知道数据存在的特征,仅仅是利用数据之间的相似性来进行分类度量的;
(以上均为MLinA的整理)