本帖最后由 1413909 于 2017-7-20 22:37 编辑
在机器学习中,分类器是一个很重要的内容,性能好的分类器能够让分类的准确率达到很理想的水平,分类器的思路通常都是要先找一些已知分类的训练数据集,然后用这些数据及其分类去训练分类器,然后再用测试数据输入训练器,训练器对这些数据做出分类,这也是一般机器学习的一种方法,常用的分类器有K邻近分类器(KNN)、贝叶斯分类器和支持向量机(SVM)。
1. K邻近分类法的基本思想是找出测试数据在特征空间中的最近邻居,然后将其归为最近邻居所属的类别。具体实现方法是检测测试数据在特征空间的k个最近邻居,然后看哪一类在这k个数据中占多数,就将测试数据归为那一类,在这种方法中,k值得选取对结果的影响非常大,不同的k值可能导致不同的分类结果,另一种成为改进型的KNN的分类方法是在原来的基础上,将k个最近数据根据距离的不同赋予不同的权重,距离近的具有更高的权重,距离远的权重降低,然后根据已经分好的类的各自权重和大小来判别测试数据的所属类别。 下面举一个简单的例子来看一下具体效果: 这里借助iris数据集产生训练数据和测试数据,并将其分为三类,分别标记为粉红、蓝色和绿色,然后把训练数据及分类传入KNN分类器来训练KNN分类器,最后就可以将测试数据输入KNN分类器,进行分类了,代码如下:
注释:导入Python数值计算模块numpy,导入绘图模块matplotlib,导入sklearn机器学习库及其中的KNN分类器和数据集。
注释:导入数据集iris,设置数据形式为二维数据,设置网格步长为0.02。
注释:设置分类颜色。
注释:用训练数据训练KNN分类器,函数neighbors.KneighborsClassifier()即为KNN分类器,它的两个参数分别为k值和权重,在这k值设为了15,权重分别设为均衡权重和按距离分配权重两个值进行两次试验。
注释:绘制分类的边界,并为每个类分配不同的颜色,然后将其绘制在二维坐标系中。
注释:将训练后的数据绘制在二维坐标轴中。 结果如图:
2. 支持向量机:前边的KNN分类器在测量测试数据到每个样本的距离时不仅需要大量的运算时间,而且还需要大量的内存存储训练样本,比较消耗资源,然而很多时候并不需要这么做,支持向量机就是一种只用一条直线将测试数据分割到不同区域的方法,它只需使用靠近边界的的数据。支持向量机简单来说就是在高维空间中寻找一个最优线性分界面,将两类数据尽可能的分开。在具体使用训练数据找到边界时,SVM要使得训练样本各组数据到边界的最短距离最大,而且在选用数据时,仅需要那些靠近边界的数据,这对简化运算很有帮助。另外对于低维空间不能线性分割的数据可以映射到高维空间进行线性分割,即为非线性分割。 下面是采用线性分割及非线性分割进行数据分割的程序:
注释:导入数值计算库numpy、绘图库matplotlib、机器学习库sklearn及其中的SVM分类器和数据集,产生训练数据集iris,只用数据的两个特征:长度和宽度,设置为二维数据集,设置网格步长为0.02。
注释:产生4类具有不同内核的SVM分类器,可分为线性SVM和非线性SVM,并将训练数据输入,SVM正则化参数设为1。
注释:产生绘制的网格,及二维坐标标题。
注释:绘制分类边界,并给各类设置不同的颜色,然后将其放入坐标轴中。
注释:将训练数据绘制到所分配的类颜色中。 运行结果如图:
补充:以上代码运行前需先安装sklearn机器学习包,matplotlib绘图包,并且需先搭建好Python环境。
|