第二章:k-近邻算法
本章内容
k-近邻分类算法
从文本文件中解析和导人数据
使用Matplotlib创建扩散图
归一化数值
2.1 k-近邻算法概述
简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。
本书讲解的第一个机器学习算法是k 近邻算法(kNN ) , 它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
2.1.1 准备:使用Python导入数据
2.1.2 从文本文件中解析数据
该函数的功能是使用k-近邻算法将每组数据划分到某个类中,其伪代码如下:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前灸个点所在类别的出现频率;
(5)返回前女个点出现频率最高的类别作为当前点的预测分类。
python函数classify0 ()如程序清单2-1所示。
2.1.3 如何测试分类器
上文我们已经使用女-近邻算法构造了第一个分类器,也可以检验分类器给出的答案是否符合我们的预期。读者可能会问:“分类器何种情况下会出错? ”或者“答案是否总是正确的? ” 答案是否定的,分类器并不会得到百分百正确的结果,我们可以使用多种方法检测分类器的正确率。
此外分类器的性能也会受到多种因素的影响,如分类器设置和数据集等。不同的算法在不同数据集上的表现可能完全不同,这也是本部分的6章都在讨论分类算法的原因所在。为了测试分类器的效果,我们可以使用已知答案的数据,当然答案不能告诉分类器,检验分类器给出的结果是否符合预期结果。通过大量的测试数据,我们可以得到分类器的错误率------分类器给出错误结果的次数除以测试执行的总数。错误率是常用的评估方法,主要用于评估分类器在某个数据集上的执行效果。完美分类器的错误率为0 , 最差分类器的错误率是1.0,在这种情况下,分类器根本就无法找到一个正确答案。读者可以在后面章节看到实际的数据例子。
上一节介绍的例子已经可以正常运转了,但是并没有太大的实际用处,本章的后两节将在现实世界中使用k近邻算法。首先,我们将使用k-近邻算法改进约会网站的效果,然后使用k-近邻算法改进手写识别系统。本书将使用手写识别系统的测试程序检测k-近邻算法的效果。
2.2 示例:使用k-近邻算法改进约会网站的配对效果
2.2.1 准备数据:从文本文件中解析数据
2.2.2 分析数据:使用Matplotlib创建散点图
Matplotlib库提供的scatter函数支持个性化标记散点图上的点。重新输入上面的代码,调用scatter函数时使用下列参数:
2.2.3 准备数据:归一化数值
在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1区间内的值:
2.2.4 测试算法:作为完整程序验证分类器
上节我们巳经将数据按照需求做了处理,本节我们将测试分类器的效果,如果分类器的正确率满足要求,海伦就可以使用这个软件来处理约会网站提供的约会名单了。机器学习算法一个很重要的工作就是评估算法的正确率,通常我们只提供已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。本书后续章节还会介绍一些高级方法完成同样的任务,这里我们还是采用最原始的做法。需要注意的是,10%的测试数据应该是随机选择的,由于海伦提供的数据并没有按照特定目的来排序,所以我们可以随意选择10%数据而不影响其随机性.
前面我们巳经提到可以使用错误率来检测分类器的性能。对于分类器来说,错误率就是分类器给出错误结果的次数除以测试数据的总数,完美分类器的错误率为0,而错误率为1.0的分类器不会给出任何正确的分类结果。代码里我们定义一个计数器变量,每次分类器错误地分类数据,计数器就加1, 程序执行完成之后计数器的结果除以数据点总数即是错误率。
为了测试分类器效果,在kNN.py文件中创建函数datingClassTest,该函数是自包含的,你可以在任何时候在python运行环境中使用该函数测试分类器效果。在kNN.py仍文件中输人下面的程序代码.
2.2.5 使用算法:构建完整可用系统
上面我们已经在数据上对分类器进行了测试,现在终于可以使用这个分类器为海伦来对人们分类。我们会给海伦一小段程序,通过该程序海伦会在约会网站上找到某个人并输入他的信息。程序会给出她对对方喜欢程度的预测值。.
2.3 示例:手写识别系统
本节我们一步步地构造使用k-近邻分类器的手写识别系统。为了简单起见,这里构造的系统只能识别数字0到9,参见图2.6。需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小® : 宽髙是32像素*32像素的黑白图像。尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理解,我们还是将图像转换为文本格式。
2 . 3 . 1 准备数据:将图像转换为测试向量
2.3.2 测试算法: 使用尽近邻算法识别手写数字
2 . 4 本章小结
k-近邻算法是分类数据最简单最有效的算法,本章通过两个例子讲述了如何使用k-近邻算法构造分类器。
k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。
k近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。下一章我们将使用概率测量方法处理分类问题,该算法可以解决这个问题。