目录
一、K-近邻算法
1.1 K-近邻算法(KNN)概念
1.1.1 概念理解举例
1.2 KNN算法流程总结
1.3 K值的选择
1.3.1 举例说明
1.4 kd树
1.4.1 KD树原理
1.4.2 树的建立
1.5 最近领域的搜索
k近邻算法优缺点
二、距离度量
2.1 距离公式的基本性质
2.2 常见的距离
2.2.1 欧氏距离
2.2.2 曼哈顿距离(Manhattan Distance):
2.2.3 切比雪夫距离(Chebyshev Distance)
2.2.4 闵可夫斯基距离(Minkowski Distance)
2.2.5 标准化欧氏距离(Standardized EuclideanDistance)
2.2.6 余弦距离(Cosine Distance)
2.2.7 汉明距离(Hamming Distance) --用于NLP比较多
2.2.8 杰卡德距离(Jaccard Distance)
2.3 “连续属性”和“离散属性”的距离计算
KNearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法,总体来说KNN算法是相对比较容易理解的算法。(KNN算法最早是由Cover和Hart提出的一种分类算法)
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。(根据你的“邻居”来推断出你的类别)
距离公式:两个样本的距离可以通过如下公式计算,又叫欧式距离,关于距离公式会在后面进行讨论。
电影类别分析
其中? 号电影不知道类别,如何去预测? 我们可以利用K近邻算法的思想
K=5, 5部片中有3个喜剧片,则唐人街探案也属于喜剧片。【 k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别】
1)计算已知类别数据集中的点与当前点之间的距离
2)按距离递增次序排序
3)选取与当前点距离最小的k个点
4)统计前k个点所在的类别出现的频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类
- 通过你的"邻居”来判断你属于哪个类别
- 如何计算你到你的"邻居”的距离:一般时候都是使用欧氏距离.
如何选取K值的大小?
K值过小:
(1)容易受到异常点的影响。k=1时,美人鱼的类别就是唐人街探案的类别,如果美人鱼类别统计错误,就意味着分类错误!
(2)容易过拟合
k值过大:(1)受到样本均衡的问题。k=6时,三个喜剧三个爱情片,如何分类?
(2)容易欠拟合
K值选择问题,李航博士的一书[统计学习方法]上所说:
1)选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,“学习“近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
2) 选择较大的K值,就相当于用较大邻域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
3) K=N(N为训练样本个数),则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。
在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。
近似误差:
1、对现有训练集的训练误差,关注训练集。
2、如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。
3、模型本身不是最接近最住模型。估计误差:
1、可以理解为对测试集的测试误差,关注测试集。
2、估计误差小说明对未知数据的预测能力好。
3、模型本身最接近最伴模型。估计误差好才是真的好
实现K近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。
这在特征空间的维数大及训练数据容量大时尤其必要。
k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。当训练集很大时,计算非常耗时。为了提高KNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。
什么是kd树
根据KNN每次需要预测一个点时,我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高。
kd树:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。
基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。这样优化后的算法复杂度可降低到0 (DNIog (N) )。感兴趣的读者可参阅论文: Bentley,J.L.,Communications of the ACM 1975)
1989年,另外一种称为Ball Tree的算法,在kd Tree的基础上对性能进一步进行了优化,感兴趣的读者可以搜索Five ball tree construction algorithms来了解详细的算法信息。
将下面数字分为两堆,方法取出一个中间数字,小于中间数字放左边,大于中间数字放右边。
黄色的点作为根节点,上面的点归左子树,下面的点归右子树,接下来再不断地划分,分割的那条线叫做分割超平面 (splitting hyperplane),在一维中是一个点,二维中是线,三维的是面。
黄色节点就是Root节点,下一层是红色,再下一层是绿色,再下一层是蓝色
最近邻域搜索 (Nearest-Neighbor Lookup)
kd树(K-dimension tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少摆索的计算量。
类比“二分查找”:给出一组数据: [914725038] ,要查找8, 如果个查找 (线性扫描),那么将会把数据集都遍历一遍,而如果排一下序那数据集就变成了:[0123456789],按前一种方式我们进行了很多没有必要的查找,现在如果我们以5为分界点,那么数据集就被圳分为了左右两个“簇”[01234]和[6 789]。
因此,根本就没有必要进入第一个簇,可以直接进入第二个簇进行查找。把二分查找中的数据点换成k维数据点,这样的划分就变成了用超平面对k维空间的划分。空间划分就是对数据点进行分类,“挨得近”的数据点就在一个空间里面。
1.4.3 构造方法
(1) 构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;
(2)通过递归的方法,不断地对k维空间进行切分,生成子结点。在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域 (子结点) ;这时,实例被分到两个子区域。
(3) 上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
(4) 通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)
KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。在构建KD树时,关键需要解决2个问题:
(1)选择向量的哪一维进行划分;
简单的解决方法可以是随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)
(2)如何划分据
第二个问题中,好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分。
假设标记为星星的点是test point, 绿色的点是找到的近似点,在回溯过程中,需要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere),如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。
kd树的构建过程
1.构造根节点
2.通过递归的方法,不断地对k维空间进行切分,生成子节点
3.重复第二步骤,直到子区域中没有示例时终止
需要关注细节:a.选择向量的哪一维进行划分;b.如何划分数据。kd树的搜索过程
1.二叉树搜索比较待查询节点和分裂节点的分裂维的值, (小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点)
2.顺着“搜索路径”找到最近邻的近似点
3.回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索
4.重复这个过程直到搜索路径为空
优点:
①简单有效
②重新训练的代价低
③适合类域交叉样本
KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
④适合大样本自动分类
该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
缺点:
①惰性学习
KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。
②类别评分不是规格化
不像一些通过概率评分的分类
③输出可解释性不强
例如决策树的输出可解释性就较强
④对不均衡的样本不擅长
当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的“邻居样本,某类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
⑤计算量较大
目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。
在机器学习过程中,对于函数 dist(.,.),若它是一"距离度量”(distance measure),则需满足一些基本性质:
非负性
同一性(同一个位置)
对称性
直递性,常被直接称为“三角不等式"
距离公式,除了欧式距离,还有哪些距离公式可以使用?
在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”(City Block distance)
国际象模中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步? 这个距离就叫切比雪夫距离。
闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。两个n维变量a(x11,x12,..,x1n)与b(x21,x22,..-,x2n)间的闵可夫斯基距离定义为:
闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离,都存在明显的缺点:
e.g.二维样本(身高[单位:cm],体重[单位:kgl),现有三个样本: a(180,50),b(190,50),c(180,60)。a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵民距离。但实际上身高的10cm并不能和体重的10kg划等号
闵氏距离的缺点:
(1) 将各个分量的量纲(scale),也就是“单位”相同的看待了
(2) 未考虑各个分量的分布 (期望,方差等) 可能是不同的
标准化欧氏距离是针对欧氏距离的缺点而作的一种改进。
思路:既然数据各维分量的分布不一样,那先将各个分量都”标准化”到均值、方差相等,Sk表示各个维度的称准差
如果将方差的倒数看成一个权重,也可称之为加权欧氏距离Weiahted Euclidean distance)。
几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。
二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
夹角余弦取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。
两个等长字符串s1与s2的汉明距离为: 将其中一个变为另外一个所需要作的最小字符替换次数。
汉明重量: 是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是1的个数,所以 11101 的汉明重量是 4。因此,如果向量空间中的元素a和b之间的汉明距高等于它们汉明重量的差a-b。
应用: 汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是,如果要比较两个不同长度的字将串,不仅要进行替换,而且要进行插入与刷除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法
杰卡德相似系数(Jaccard slmilarity coeficient): 两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示:
我们常将属性划分为“连续属性“(continuous attribute)和“离散属性”(categorical attribute),前者在定义城上有无穷多个可能的取值,后者在定义域上是有限个取值.
若属性值之间存在序关系,则可以将其转化为连续值,例如: 身高属性“高”“中等”“矮”,可转化为{1,
0.5,0}。 闵可夫斯基距离可以用于有序属性。
若属性值之间不存在序关系,则通常将其转化为向量的形式,例如:性别属性“男” ”女”,可转化为{(1,0) ,(0,1)} 。