1.7.1 简介和问题概述
前面说过,我们从一个简单的问题开始给花分类。我们要实现一个流行的算法,叫作k最近邻(k-nearest neighbor),简称KNN[8]。我们需要一套训练集,分类器算法将其作为正确分类鸢尾花的示例。每个训练样本都有多个属性、一个分数和最终的正确分类(也就是鸢尾花的种类)。在这个鸢尾花的示例中,每个训练样本都是鸢尾花,有花瓣形状、大小等属性,这些属性被放在一个数字向量中(向量是Vector,也可被理解为列表)表示这个鸢尾花,在向量中还包括这个鸢尾花的正确分类标签。
假设有一个未知样本,我们想要知道它属于哪个鸢尾花种类。我们可以计算未知样本和已知样本在向量空间中的距离,然后让少量的近邻投票。这个未知样本可以被分类到大部分近邻归属的那个分类中。
如果我们只有两个维度(或属性),那么我们可以用图1.11表示KNN分类器。
图1.11 k最近邻
我们的未知样本是一个带有双问号(??)的菱形。它的周围有已知样本,用圆形和正方形表示不同的种类。在用一个虚线表示的圆确定3个最近邻后,我们可以投票并决定这个未知样本最可能是圆形种类的(因为在它的邻居中,圆形种类有2个,而正方形种类只有1个)。
使用人工智能算法的一个基础概念是,属性需要用具体的数字来表示。把文字、地址和其他非线性的数据转换成线性的数字具有一定的挑战性。好消息是我们接下来要使用的数据都已被转换成具体的数字表示。
另一个概念是可以参与投票的邻居的个数。这就是KNN中的k因素。在我们的概念图中,我们让k=3,存在3个邻居,其中2个是圆形,第3个是正方形。如果我们改成k=5,将会改变参与投票的样本池,最终胜出的将会是正方形。哪个是正确的?这需要使用已知答案的测试集来确认分类算法的正确性。在上图中,菱形样本正好落在两个种类(圆形和正方形)的中间,故意制造出一个困难的分类问题。
鸢尾花分类数据集是学习这个分类问题的最常用数据集。通过链接2可以找到数据集的介绍,通过链接3也可以找到,在很多其他网站上也能找到。
在做面向对象分析和设计的过程中,更多的有经验的读者可能会注意到一些差距和矛盾之处。这是故意为之的。对任何问题的初步分析都会涉及学习和改进。这个案例学习也会随着我们的学习而演化。如果你已经发现了一些差距或矛盾,请试着做出自己的设计,看看这些差距是否会随着接下来章节的学习而逐渐缩小。
在研究了问题的某些方面之后,我们可以提供一个更具体的,包含参与者以及描述参与者如何与系统交互的用例(use case)或场景的上下文。我们将从上下文视图开始。