标签:
kNN-------k-邻近算法
1.kNN是non-parametric分类器,既不做分布式假设,直接从数据估计概率密度;
2.kNN不适用于高维数据
优点:
1.无需估计参数,无需训练;
2.特别适合于多分类问题(对象具有多个标签)。
缺点:
1.当样本容量不平衡是,输入有个新样本,该样本的K个邻值中大容量样本占多数,对分类不利;
2.计算量过大,需要计算待分类文本到每个样本的距离。
改进办法:
1.实现对样本属性进行适当删减,删除对结果影响较小的属性;
2.对距离加权,采取和样本距离小的待分类文本距离权重大。
算法伪代码:
1.计算已知类别数据集中的点与当前点之间的距离;
2.按照距离递增次排序;
3.选取与当前点距离最小的k个点;
4.确定前k个点所在类别的出现频率
5.返回前k个点出现频率最高的类别作为当前点的预测分类
python代码实现KNN算法
def kNN(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] #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): #将labels对应相应的点 voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #排序,选出k个距离最小的值 return sortedClassCount[0][0]inX:用于分类的输入向量。即将对其进行分类。
标签:
原文地址:http://blog.csdn.net/chinwuforwork/article/details/51333904