首页 > 代码库 > 机器学习算法一:K-近邻算法
机器学习算法一:K-近邻算法
最近在《机器学习实战》里学习了一些基本的算法,对于一个纯新手我也在网上找了写资料,下面就我在书上所看的加上在其他博客上的内容做一个总结,博客请参照http://www.cnblogs.com/BaiYiShaoNian/p/4567446.html
K-近邻算法
K-近邻算法就是采用测量不同特征值之间的距离方法来进行分类。
优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度高,空间复杂度高。
适用范围:数值型和标称型。
工作原理:
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据之后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出样本集中特征最相似数据的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是K-近邻算法名称的由来。
使用Python导入数据
从K-近邻算法的工作原理中我们可以看出,要想实施这个算法来进行数据分类,我们手头上得需要样本数据,没有样本数据怎么建立分类函数呢。所以,我们第一步就是导入样本数据集合。
建立名为kNN.py的模块,写入代码:
1 from numpy import * 2 import operator 3 4 def createDataSet(): 5 group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) 6 labels = [‘A‘,‘A‘,‘B‘,‘B‘] 7 return group, labels
代码中,我们需要导入Python的两个模块:科学计算包NumPy和运算符模块。NumPy函数库是Python开发环境的一个独立模块,大多数Python版本里没有默认安装NumPy函数库,因此这里我们需要单独安装这个模块。
我们在createDataSet()函数里创建数据集group和标签lable作为训练样本,根据工作原理可知,数据集中每个数据都有标签,labels包含的元素个数等于group矩阵的行数。这里我们将数据点(1,1.1)定义为类A,数据点(0,0.1)定义为类B。例子中的数据是任意选择的,并没有给出轴坐标。
实现K-近邻算法
K-近邻算法的具体思想如下:
(1)计算已知类别数据集中的点与当前点之间的距离
(2)按照距离递增次序排序
(3)选取与当前点距离最小的k个点
(4)确定前k个点所在类别的出现频率
(5)返回前k个点中出现频率最高的类别作为当前点的预测分类
Python语言实现K-近邻算法的代码如下:
1 # coding : utf-8 2 3 from numpy import * 4 import operator 5 import kNN 6 7 group, labels = kNN.createDataSet() 8 9 def classify(inX, dataSet, labels, k): 10 dataSetSize = dataSet.shape[0] 11 diffMat = tile(inX, (dataSetSize,1)) - dataSet 12 sqDiffMat = diffMat**2 13 sqDistances = sqDiffMat.sum(axis=1) 14 distances = sqDistances**0.5 15 sortedDistances = distances.argsort() 16 classCount = {} 17 for i in range(k): 18 numOflabel = labels[sortedDistances[i]] 19 classCount[numOflabel] = classCount.get(numOflabel,0) + 1 20 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True) 21 return sortedClassCount[0][0] 22 23 my = classify([0,0], group, labels, 3) 24 print my
运算结果如下:
输出结果是B:说明我们新的数据([0,0])是属于B类。
代码详解
相信有很多朋友们对上面这个代码有很多不理解的地方,接下来,我重点讲解几个此函数的关键点,以方便读者们和我自己回顾一下这个算法代码。
classify函数的参数:
- inX:用于分类的输入向量
- dataSet:训练样本集合
- labels:标签向量
- k:K-近邻算法中的k
shape:是array的属性,描述一个多维数组的维度
tile(inX, (dataSetSize,1)):把inX二维数组化,dataSetSize表示生成数组后的行数,1表示列的倍数。整个这一行代码表示前一个二维数组矩阵的每一个元素减去后一个数组对应的元素值,这样就实现了矩阵之间的减法。
axis=1:参数等于1的时候,表示矩阵中行之间的数的求和,等于0的时候表示列之间数的求和。
argsort():对一个数组进行非降序排序
classCount.get(numOflabel,0) + 1:get():该方法是访问字典项的方法,即访问下标键为numOflabel的项,如果没有这一项,那么初始值为0。然后把这一项的值加1。所以Python中实现这样的操作就只需要一行代码,实在是很简洁高效。
机器学习算法一:K-近邻算法