机器学习之K-近邻算法代码分析

来源:互联网 发布:java cs的前景 编辑:程序博客网 时间:2024/06/07 07:31

在看Peter的K-近邻实战时,发现原来“手写识别系统”不止是图像处理和图像识别可以解决,原来从图像也是矩阵数据的层面来看,不同数字的识别也是数据分类问题(2333……又打开了思维的新视角)。因本身是学图像处理出身,所以关于手写识别系统,思维受限在怎样进行图像处理、怎样训练数字模型、怎样进行数字识别了。

该文先简单在Jupyter上实现K-近邻算法。后续会专门通过一步步构造使用K-近邻分类器实现手写识别系统(识别数字0~9)。


基础知识准备——Python导入数据

在构造K-近邻算法之前,我们需要先编写一些通用函数,我们可以把所有的通用函数写的一个python文件(.py)下。下面写个例子,看下python里怎样写通用函数并调用。小编使用的Jupyter(可以直接在notebook下编写通用函数和测试,建立.py可选)。

依次执行Cells。In[4]和In[5]是定义了通用函数createDataSet(),函数里写死了一组数据和对应标签,标签有两类A和B。我们通过这个简单例子,可以大致了解Python如何解析数据和加载数据,上一篇了解了KNN算法的工作原理。下面使用这些知识和方法完成分类任务。


基础知识准备——文本文件中解析数据

该部分实现功能:使用k-近邻算法将魅族数据划分到某个类中,代码和释义如下:

输入参数inX:用于分类的输入向量;

输入参数dataSet:输入的训练样本集

输入参数labels:标签向量(元素数目和dataSet的行数相同)

输入参数k:用于选择最近邻的数目。

计算两个向量点xA和xB之间的距离用的欧式距离:

计算完所有点之间的距离后,对数据按照从小到大的次序排序。然后确定前k个距离最小元素所在的主要分类,输入k总是正整数。最后,将classCount字典分解为元组列表,然后导入运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序。此处的排序为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签。


基础知识准备——测试分类器

为了预测数据所在分类,执行:

小结

在参照实例进行学习和测试的过程中,遇到了很多问题,有编程语法方面的,也有算法理解上的。但不管怎样,算是跑通了个实例。需要注意的是书里提供的代码有些问题,有的问题是因为python版本变化引起的,也有书写方式引起的,比如,在引用python模块时,尽量不要import *,需要用什么就import什么。


我能够看得更远,那是因为我站在巨人的肩上

 — 艾萨克·牛顿

欢迎转发到朋友圈或分享给好友


原创粉丝点击