标签:
在博客园的第一篇文章,但不会是最后一篇文章。虽说机器学习这个名字听起来挺唬人的,但是我们知道每一个貌似专业的名词都是用来忽悠小白的。因此对于那些貌似专业的名词,我们需要弄懂它们到底在说的什么,也许这就是我一直所追求的Hacker精神。
K-近邻算法是机器学习中比较简单的一个算法,但是也不会是小白那样的简单,而是相比于机器学习的其它算法来说比较简单而已。首先来说说K-近邻算法的精要思想:比较测试样本与训练样本集中每一个样本的距离,然后按照距离递增的顺序排序,下来选取前K个与测试样本距离比较近的样本的类别标签,然后选取在K个标签中,出现频率最高的类别,这个类别就是K-近邻算法基于训练样本集给出的测试样本的预测类别。
在上面的精要思想阐述中,有这样几个问题。
相应问题的讨论:
下面我们就来看一下用Python来进行实现的一些实例:
假如像下面这样创建了一个数据集
1 def createDataSet(): 2 group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) 3 labels = [‘A‘,‘A‘,‘B‘,‘B‘] 4 return group,labels
其中的group变量是Numpy中的数组,3行2列,表示3个样本即3个2维数值向量。labels列表里面存储的是与训练样本集group中样本相对应的类别标签。这样我们就可以得到一个训练样本集以及所对应的类别标签列表。
假如我们现在有一个测试向量a=[1.0,1.0],我们需要给向量a根据训练样本集预测一个类别,a到底是属于类别A呢,还是属于B呢?如下就是K-近邻算法的实现:
1 def classifyKNN(inX, trainingDataSet, trainingLabels, k): 2 dataSetSize = trainingDataSet.shape[0] 3 diffMat = tile(inX, (dataSetSize,1)) - trainingDataSet 4 sqDiffMat = diffMat**2 5 sqDistances = sqDiffMat.sum(axis=1) 6 distances = sqDistances**0.5 7 sortedDistIndicies = distances.argsort() #返回排序的索引结果 8 classCount = {} 9 for i in range(k): 10 votedLabel = trainingLabels[sortedDistIndicies[i]] 11 classCount[votedLabel] = classCount.get(votedLabel,0) + 1 12 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) 13 return sortedClassCount[0][0]
然后在Python shell中输入
1 classifyKNN([1.0,1.0],group,labels,3)
获取输出结果为
1 ‘A‘
一切看起来都是那么的自然简单,但是现实的情况远远没有这么简单。在实际问题中我们还需要考虑,怎么才能将实际中的数据化为向量表示?而且我们由欧式距离的计算公式可以看出,如果其中某一维的数值取值范围远远大于其他取值范围的话,那么取值范围大的属性将会对距离产生很大的影响,所以如何认为每一个属性都同样重要的话,那么就需要对这些不同取值范围的属性继续进行处理。还有,有些样本的属性是标称型的,不是数值型,这样又该如何处理呢?
大家不要心急,请期待下一篇文章讨论如何在实际中应用K-近邻算法。
标签:
原文地址:http://www.cnblogs.com/Long-Hacker/p/4535270.html