很久之前写的一篇文章,最近有用到又重新研究了一下,顺手发上来。
打算开始学习机器学习,先看到的是KNN算法(K近邻算法)。首先是关于knn算法的原理的一段文字描述,对它有个最初的认识:
假设我们有一堆分好类的样本数据,分好类表示每个样本都有自己的一个标签,当出现一个测试样本需要我们判断它该属于那个类别时,我们就分别计算出它到每个样本之间的距离,然后取离测试样本最近的K个样本标签进行投票,得票数最多得那个标签就是测试样本得标签。
下面就用python代码一步步得实现上面所描述得原理:
from numpy import *
import operator
首先我们需要一堆分好类得样本数据,那我们就用新建这样得一些样本数据,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
上面的代码一共分了A和B两类,每个类别分别有两个样本,等下我们会分别计算被测样本到每个已知样本的距离,然后使用KNN算法。下面这段代码就是进行分类投票的:
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]#shape 函数返回这个数组的行数和列数
diffMat = tile(inX, (dataSetSize,1)) - dataSet#tile函数根据第二个参数来扩充数组
sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()#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]
那如何使用这个东西呢,我们只需要先构造样本数据:
group, labels = kNN.createDataSet()
然后进行投票测试:
kNN.classify0([0,0],group,labels ,3)
这个函数第一个参数未知分类的样本的坐标,第二个参数就是已知分类的样本,第三个就是分类,第四个参数就是K,经过排序之后我们需要获取前k个距离样本进行投票测试。
这个例子只是对kNN算法的一个小试牛刀,但是区区十几行代码,却能阐述出一种分类的思想,确实是很强大的。
参考:
《Machine Leaning in Action》