machine learning in action 之二 —— k-Nearest Neighbors

Python的使用我就不详细介绍了,因为我自己也不是特别熟悉(O(∩_∩)O哈哈~),不过Python和matlab差不多,语法很简单,用多了看多了自然就熟悉了,我之所以记录“machine learning in action”主要的目的也不是熟悉python,主要是记录我的学习过程,想提高自己的算法逻辑能力,而主要的切入点是常见的machine learning算法。所以接下来的教程中,编程语法我不太会多说,主要侧重于算法应用。

以下介绍的任何内容,大家有任何疑问,或者是对我有任何建议,可以随时在评论中提出来,我会尽量经常去查看,并给大家回复。

第一个要讲的算法是k-Nearest Neighbors(K-NN),即K-近邻算法,也是机器学习算法中最常见且简单的一个分类算法,主要采用测量不同特征值之间的距离来进行分类。

K-NN工作原理是:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都有标签(label),即我们知道样本集中每个数据所属分类的对应关系。输入一个没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相近数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相近的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相近数据中出现次数最多的分类,作为新数据的分类结果。

这个算法原理很简单,所以我就不多说了,直接讲解代码实现。

功能:使用k-近邻算法将每组数据划分到某个类别中,伪代码如下:

对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

Python实现classify0(),如下:

# 程序清单2-1  k-近邻算法
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    # 距离计算
    # tile: repeat the items N times
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    # 选择距离最小的k个点
    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]

classify0()函数有4个输入参数:用于分类的输入向量inX,输入的训练样本集dataSet,标签向量labels,最后参数k表示用于选择最近邻的数目,其中标签向量的元素个数和矩阵dataSet的行数相同。程序清单2-1中使用欧氏距离公式(当然你可以换成其他的距离计算公式),计算两个向量点xA和xB之间的距离:

d=(xA0xB0)2+(xA1xB1)2

如果特征是多维的,那么依次加在后面即可。

这样,我们就构建了一个简单的k-NN分类器了,使用这个分类器可以完成很多分类任务。

举个简单的例子:首先创建一个已知标签的训练集,这个数据集中只有4个数据{(1.0,1.1), (1.0,1.0), (0,0), (0,0.1)},前两个属于A类,后两个属于B类,python代码如下:

# 程序清单2-2  数据导入模块
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

实验测试,创建名为kNN.py的python模块,将程序清单2-1和2-2输入到这个文件中。

进入python开发环境,开始——运行——cmd——进入kNN文件夹——python,
首先导入kNN模块,然后查看导入的数据集

>>> import kNN
>>> group,labels = kNN.createDataSet()

结果如下:
machine learning in action 之二 —— k-Nearest Neighbors_第1张图片

然后使用classify0()进行数据分类预测

>>> kNN.classify0([0,0], group, labels, 3)

输出结果为:
img2
即预测结果为[0,0]属于“B”类,大家可以自己试试其他的数据分类结果。

到此,kNN简单的分类器构建完成了,接下来会用构建的kNN处理实际问题。

你可能感兴趣的:(machine,learning,in,action,python,k-近邻)