机器学习:KNN 算法
KNN算法介绍
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
KNN算法实现流程
(1)收集数据:可以使用任何方法。
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3)分析数据:可以使用任何方法。
(4)训练算法:此步驟不适用于1 近邻算法。
(5)测试算法:计算错误率。
(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行女-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
KNN简单示例
通过createDataSet 来创建数据集和标签
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
classify0函数四个输入分别为 输入,,输人的训练样本集为dataSet,
标签向量为labels,最后的参数义表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet 的行数相同
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。
diffMat = tile(inX, (dataSetSize,1)) - dataSet # tile 原型:numpy.tile(A,reps) tile共有2个参数,A指待输入数组,reps则决定A重复的次数。整个函数用于重复数组A来构建新的数组。
sqDiffMat = diffMat**2 # 算平方
sqDistances = sqDiffMat.sum(axis=1) #求和
distances = sqDistances**0.5 #开方,得到距离 [ 2.21 2. 0. 0.01]
sortedDistIndicies = distances.argsort() #排序
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
测试classfiy0
if __name__ == '__main__':
group,labels = createDataSet()
print classify0([0, 0], group, labels, 3)
得到分类为"B"
总结
KNN 算法是最简单的分类算法, 使用算法时我们必须有接近实际数据的训练集,如果训练集比较大,必须使用大量的存储空间,而且KNN算法必须进行对每个数据进行距离值的计算,所以使用时很耗时间。