机器学习算法总结 K近邻

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) (2) (k ) T 其中 x i (x i ,x i , ,x i ) ,i 1,2, ,N ;
输出:kd 树。 (1)开始:构造根结点,根结点对应于包含 T 的 k 维空间的超矩形区域. 选择 x
(1)
为坐标轴,以 T 中所有实例的坐标的中位数为切分点,将根结点对应的超矩形区
第一章 k 近邻
1.1 K 近邻简介
k 近邻(k-Nearest Neighbor,k-NN)是一种基本的、有监督学习的分类方法,于 1968年由 Cover 和 Hart 提出,其用于判断某个对象的类别。k 近邻的输入为对象特征 向量,对应于特征空间上的点;输出为对象的类别。 k 近邻算法实例引入:
1.3.1 kd 树的构建
该方法来自斯坦福大学的 Jon Louis Bentley 在 ACM 杂志上发表的一篇论文: Multidi-mensional Binary Search Trees Used for Associative Searching ,这篇论 文中正式提出 kd 树,并阐述的了 kd 树的构建等(此时的 k 与 kNN 中的 k 含义是不同 的) 。 kd 树是一种对 k 维空间中的实例点进行存储以便对其进行快速检索的树形 数据结构。 kd 树是二叉树,表示对 k 维空间的一个划分(partition)。构造 k 树相 当于不断地用垂 直于坐标轴的超平面将 k 维空间切分,构成一系列的 k 维超矩形区域。kd 树的每个结点对 应于一个 k 维超矩形区域。 构造 kd 树的方法如下:构造根结点,使根结点对应于 k 维空间中包含所有对象点的超 矩形区域;通过下面的递归方法,不断地对 k 维空间进行切分,生成子结 点。在超矩形区
y arg max
cj
xi N k (x )

I ( y i c j ),i 1,2, , N ; j 1,2, , K
1)
(1-
其中, I 为指示函数,即当 y i cj 时 I 为1,否则 I 为0。 k 近邻的特殊情况是 k=1的情形,称为最近邻算法,对于输入的对象(特征向量) x,最近邻法将训练数据集中于 x 最近邻点所属的类作为 x 的类。 1.2 K 近邻模型建立 建立数学模型的过程实质就是确定三个基本要素的过程。
下面,给出 k 近邻算法的数学表述: 输入:训练数据集
T {(x 1 ,y 1 ),(x 2 ,y 2 ), ,(x N ,y N )}
其中, x i R n 为实例的特征向量, y i {c1 ,c 2 , ,ck } 为实例的类别, i 1,2, ,N ;实例 特征向量 x ; 输出:实例 x 所属的类。 (1)根据给定的距离度量,在训练集 T 中找出与 x 最邻近的 k 个点,涵盖这 k 个点的 x 的邻域记作 N k(x ); (2)在 N k(x ) 中根据分类决策规则(如多数表决)决定 x 的类别 y:
p
n
1 p
(1-5) 特点:为综合性的公式 。 (5)马氏距离: d(X ,Y ) (1-6)
i 1
T (X Y ) 1(X Y )
特点:可排除对象间的相关性。 (6)相关距离: (1-7) (7)夹角余弦距离和 Tonimoto 系数: (I)夹角余弦距离:s(X ,Y ) (1-8)
图1.3 构造平衡 kd 树算法
图1.4 特征空间划分 例
1.3.2 kd 树的最近邻搜索算法:
图1.5
kd 树示
(1)基本思想: 给定一个目标点,搜索其最近邻。首先找到包含目标点的叶结点;然后从该叶节
点出发,依次回退到父结点,当确定不可能存在更近的结点时终止; 包含目标点的叶结点对应包含目标点的最小超矩形区域,以此点的实例点作为当前最 近点,目标点的最近邻一定在以目标点为中心并通过最近点的超球体的内部。然后返回当前 结点的父结点,如果父结点的另一子结点的超矩形区域与超球体相交,那么在相交的区域内 寻找与目标点更近的实例点。如果存在这样的点,将此点作为新的当前最近点,算法转到更 上一级的父结点,继续上述过程。如果父结点的另一子结点的超矩形区域与超球体不相交, 或不存在比当前最近点更近的点,则停止搜索。详细的最近邻搜索算法如下: 算法1.2(见图1.6) : 输入:已构造的 kd 树;目标点 x; 输出:x 的最近邻。 (1)在 kd 树中找出包含目标点 x 的叶结点:从根结点出发,递归地向下访问 kd 树。 若目标点 x 当前维的坐标小于切分点的坐标,则移动到左子结点,否则移 动到右子结点.直 到子结点为叶结点为止。 (2)以此叶结点为“当前最近点” 。 (3)递归地向上回退,在每个结点进行以下操作: (a) 如果该结点保存的实例点(即当前父节点)比当前最近点距离目标点更 近,则以该实例点为“当前最近点” 。 (b) 检查该子结点的父结点的另一子结点对应的区域是否有更近的点。具体 地,检查另一子结点对应的区域是否与以目标点为球心、以目标点与“当前最近点” 间的距离为半径的超球体相交。如果相交,可能在另一个子结点对应的区域内存在距 目标点更近的点,移动到另一个子结点,作为当前父节点。接着,递归地进行最近邻 搜索,递归到叶子结点为止(从上到下) ; 如果不相交,向上回退,退回到上上层父节点。 (4)当回退到根结点时,搜索结束。最后的“当前最近点”即为 x 的最近邻点。 注意:上面这种方式只是一种近似计算方法,因为它只考虑了 kd 树的一边(左或右 子树) ,而没有遍历另一边。 该算法的时间复杂度是 O(log N ),其中 N 是训练实例数。树更适用于训练实例数远大
图1.2 三维 kd 树 通常,依次选择坐标轴对空间切分,选择训练对象点在选定坐标轴上的中位数为切分 点,这样得到的 kd 树是平衡的。在确定坐标轴时,选着当前方差最大的效果较好,因为此 时区分度最大。注意,平衡的树搜索时的效率未必是最优的。 下面给出构造以树的算法(见图1.3) : 算法1.1 (构造平衡 kd 树) 输入:k 维空间数据集T {x 1 ,x 2 , ,x N } ,
1.2.1 距离度量方式的确定
样本空间(特征空间)中两个对象的距离是它们相似程度的量化反映。k 近邻模型的 特征空间可被抽象为 n 维的向量空间 R,现在两个对象之间的距离就可转化为两个向量之 间的距离,这样研究起来就方便多了。在 k 近邻模型中,计算向量之间距离的公式列举如 下: (1) 欧式距离: d ( X , Y ) (1-2)
D XY 1 XY
X Y XY
T( X ,Y ) (II)Tonimoto 系数(夹角余弦的改进) :
(1-9)
X Y X
2
Y
2
X Y
下面给出计算欧式距离的 C/C++ 代码:
//计算欧氏距离 double euclideanDistance(const vector<double>& v1, const vector<double>& v2) { assert(v1.size() == v2.size()); double ret = 0.0; for (vector<double>::size_type i = 0; i != v1.size(); ++i) { ret += (v1[i] - v2[i]) * (v1[i] - v2[i]); } return sqrt(ret); }
1.2.3 分类决策规则
(1)多数表决 k 近邻法中的分类决策规则往往是多数表决,即由输入对象的 k 个邻近中的多数类决定 输入对象的类,通俗点就是“少数服从多数” 。 (2)误分类率 误分类率即对输入对象出现错误分类的概率。其数学表示如下: 对给定的实例 x , 其最近邻的 k 个训练实例点构成集合 N k(x ) .如果涵盖 N k(x ) 的区域 的类别是 cj ,那么误分类率是
1
k
xi
N x
I(y i cj ) 1
1பைடு நூலகம்)
1
k( )
k
xi N k (x )

I(y i cj )
(1-
要使误分类率最小即经验风险最小,就要使 等价于经验风险最小化.
xi N k (x )

I(y i cj )最大,所以多数表决规则
1.3 k 近邻算法的实现
在实现 k 近邻法时,主要考虑的问题是如何对训练数据进行快速 k 近邻捜索。 k 近邻法最简单的实现方法是线性扫描法(linear scan)。即计算输入对象与每一个训 练对象之间的距离,然而当训练集很大时,计算非常耗时,这种方法是不可行的. 为了提高 k 近邻搜索的效率,我们可以构建数据的索引(因为实际数据一般都会呈现 簇状的聚类形态,因此我们想到建立数据索引,然后再进行快速匹配) 。索引树是一种树结 构索引方法,其基本思想是对搜索空间进行层次划分。根据划分的空间是否有混叠可以分为 Clipping 和 Overlapping 两种。前者划分空间没有重叠,其代表就是 kd 树;后者划分空 间相互有交叠,其代表为 R 树。下面主要介绍其中的 kd 树(kd tree)方法。
(x
i 1
n
i
yi )2
(2)曼哈顿距离:
d ( X ,Y )

n
(1-3)
i 1
| xi yi |
(3)切比雪夫距离: d( X ,Y ) max (| xi yi |) (1-4)
1in
(4)闵可夫斯基距离: d ( X , Y ) ( | x i y i | )
(1)
域切分为两个子区域.切分由通过切分点并与坐标轴 x
垂直的 超平面实现.
(1)
由根结点生成深度为1的左、右子结点:左子结点对应坐标 x 子结点对应于坐标 x
(1)
小于切分点 的子区域,右
大于切分点的子区域.
将落在切分超平面上的对象点保存在根结点.
(2)重复:对深度为 j 的结点,选择 x (l ) 为切分的坐标轴, l j(mod k ) 1 , 以该结 点的区域中所有实例的 x (l ) 坐标的中位数为切分点,将该结点对应的超 矩形区域切分为两个 子区域.切分由通过切分点井与坐标轴 x (l ) 垂直的超平面实现. 由该结点生成深度为 j+ 1的左、右子结点:左子结点对应坐标 x (l ) 小于切分点的子区域, 右子结点对应坐标 x (l ) 大于切分点的子区域. 将落在切分超平面上的对象点保存在该结点. (3) 直到两个子区域没有实例存在时停止.从而形成 kd 树的区域划分. 例1.1 给定一个二维空间的数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)} 构造一个平衡 kd 树. 解:根结点对应包含数据集 T 的矩形,选择 轴,6个数据点的 坐标的中位数是7,以平面 将空间分为左、右两个子矩形(子结点);接着,左矩形以 分为两个子矩形,右矩形以 分 为两个子矩形,如此递归,最 后得到如图3.3所示的特征空间划分和如图3.4所示的 kd 树。
图1.1
k 近邻实例
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示, 而图正中间的那个绿色的圆所示的数据则是待分类的数据。也就是说,现在,我们不知道中 间那个绿色的数据是从属于哪一类(蓝色小正方形 or 红色小三角形) ,下面,我们就要解决 这个问题:给这个绿色的圆分类。 所谓物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从 他/她身边的朋友入手。要判别上图中那个绿色的圆是属于哪一类数据,只需根据它周围的 邻居即可。但一次性看多少个邻居呢?从上图中,你还能看到: 如果 k=3,绿色圆点的最近的3个邻居(欧式距离)是2个红色小三角形和1个 蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三 角形一类。 如果 K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形, 还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。 上面这个小例子基本上体现了 k 近邻算法的三个基本要素:确定度量方式(欧式距 离) 、选着 k 值(2 or 3) 、分类决策规则(少数服从多数) 。
域(结点)上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面 经过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结 点) :这时,对象被分到两个子区域。重复这个过程直到子区域内没有对象时终止(终止时 的结点为叶结点)。在此过程中,将所有对象保存在相应的结点上。对于三维的情形,kd 树 对空间的划分,如下图所示:
1.2.2 K 值的选择
选择较小的 K 值,近似误差会减小,估计误差会增大,意味着整体模型变得复杂,容 易发生过拟合; 选择较大的 K 值,减少估计误差,近似误差会增大,K 值的增大就意味着整体的模型 变得简单。 在实际应用中,K 值一般取一个比较小的数值,例如采用交叉验证法(一部分样本 做训练集,一部分做测试集)来选择最优的 K 值。
相关文档
最新文档