k近邻法

k近邻法的思想:

k近邻法是一种基本分类与回归方法。输入为实例的特征向量,输出为实例的类别(可取多类)。具体过程是:给定一个已经分好类的数据集,对于新的实例,加入此数据集,以离这个点最近(距离度量)的k个点(k值选取)的类别进行多数表决(分类策略)去决定这个新的实例的类别。

k近邻法三要素:

k值的选择:

k小,用于训练的点少,只有新实例点旁边的点起作用(表决),近似误差小,估计误差大;k大,用于训练的点的数量多,模型较简单,近似误差大,估计误差小。

距离的度量:

特征空间中两个实例之间的距离是两个实例之间相似程度的度量。距离的度量方式有L1距离(曼哈顿距离)L2距离(欧式距离),更一般的Lp距离或明氏距离。

分类的策略:

多数表决。等价于经验风险最小化。

kd树

kd树是什么:

k近邻法需要判断实例点之间的距离,大规模数据时,不停的计算距离显然是一件十分耗时的事情。为了减少计算的次数以提高效率,考虑用特殊的结构去存储训练数据,这里用kd树来存储。kd树首先是一种二叉树。因为数据可以是高维的,所以对应的kd树的每个节点都是一个k维数值点的二叉树。这也是与以前学的二叉树的一个不同。kd树主要应用在高维数据索引上,做空间划分和近邻搜索。以上是kd树的作用,明白了它是用来划分高维空间、存储高维数据的之后,接下来要知道kd树如何构造,怎么就划分了高维空间了,以及怎么样搜索就减少了计算的次数了。

kd树的构造

一维数据构造的二叉树及其查找过程:

比如这是一个班里语文的成绩,现在想找出来成绩在区间[40,80]之间的,很好找,设此集合为S1。

但如果还要求数学成绩在区间[80,90]里,我们就需要同样的方法,在数学成绩二叉树里找出这个集合S2,然后S1∩S2。

那初中九门课呢,如果对每门课都要求了区间,就要求九个集合在求交集嘛?有点麻烦的。所以考虑把每个学生的这九门课成绩放在一起组成一个九维的数据,用这个九维的数据去构造一个二叉树,也就是kd树了,再搜索数据就可以直接从这个树里找。

一步步来,往上先升一维。对于二维平面点(x,y)的集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2),如何构造kd树呢

首先要选择从哪个维度进行切分。一般选择在哪个维度上坐标值的方差大就选哪个维度(方差大说明分的散,从这个维度切分的比较均匀)。这是二维的数据,我不知道书上算了没反正直接选了第一维切分,但我算了下方差确实第一维大。这个只是顺序问题,肯定不是说选了第一维就不在第二维切分了,只是先在第一维切,然后第二维,然后第一维,循环,直到子区域没有实例点了就停止。这也是kd树的一般构造过程的一步,循环依序取数据点的各维度来作为切分维度,取数据点在该维度的中值作为切分超平面,将中值左侧的数据点挂在其左子树,将中值右侧的数据点挂在其右子树。递归处理其子树,直至所有数据点挂载完毕。

然后构造根节点,根节点是对应于k维空间中包含所有实例点的超矩形区域(这个反正都是固定的)。然后选择第一维坐标的中位数作为切分点,对这个超矩形区域进行第一次切分。中位点怎么选呢,有两种:第一种,算法开始前,对原始数据点在所有维度进行一次排序,存储下来,然后在后续的中值选择中,无须每次都对其子集进行排序,提升了性能。
第二种,从原始数据点中随机选择固定数目的点,然后对其进行排序,每次从这些样本点中取中值,来作为分割超平面。该方式在实践中被证明可以取得很好性能及很好的平衡性。这里就选第一种。

以上点集合在第一维从小到大排序为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6);其中值为(7,2)。(注:2,4,5,7,8,9在数学中的中值为(5 + 7)/2=6,但因该算法的中值需在点集合之内,所以本文中值计算用的是len(points)//2=3, points[3]=(7,2))所以(7,2)这个点就是你构造出来的kd树的根节点了。第一维小于7的挂在左边:(2,3)(4,7)(5,4);大于7的挂在右边:(8,1)(9,6)。然后左右两边都要对第二维进行切分了,左边三组按第二维排序选出中位数为4,右边选中位数为6,各自切分:

再往下都是叶子节点了,就结束了。

kd平衡树

像上面那个步骤选取中位数为切分点、循环依次按维度切分,构造出来的就是平衡kd树。一个平衡的kd树,其所有叶子节点到根节点的距离近似相等。但一个平衡的k-d tree对最近邻搜索、空间搜索等应用场景并非是最优的。

k近邻法 kd树 平衡kd树相关推荐

  1. 统计学习笔记(3)——k近邻法与kd树

    在使用k近邻法进行分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方式进行预测.由于k近邻模型的特征空间一般是n维实数向量,所以距离的计算通常采用的是欧式距离.关键的是k值的选取, ...

  2. K近邻法之kd树及其Python实现

    作为机器学习中一种基本的分类方法,K近邻(KNN)法是一种相对简单的方法.其中一个理由是K近邻法不需要对训练集进行学习.然而,不需要对训练集进行学习,反过来也会造成对测试集进行判定时,计算与空间复杂度 ...

  3. 复现经典:《统计学习方法》第 3 章 k 近邻法

    本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...

  4. 机器学习理论《统计学习方法》学习笔记:第三章 k近邻法

    机器学习理论<统计学习方法>学习笔记:第三章 k近邻法 3 k近邻法 3.1 K近邻算法 3.2 K近邻模型 3.2.1 模型 3.2.2 距离度量 3.2.3 K值的选择 3.2.4 分 ...

  5. 经典机器学习算法:k近邻法

    基于李航教授的<统计学习方法>,本博客为个人学习笔记. 只记录精华,不讲废话,让看过或没看过的你和我短时间重新领悟该方法. k近邻法(knn)与k-means的比较: 两者共同点: 1.k ...

  6. 机器学习(二):k近邻法(kNN)

    引言 一.k近邻法的三要素 1.距离度量 2.k值的选择 3.分类决策规则 二.k近邻算法及代码实现(python) 1.算法 2.代码实现(python) 三.k近邻法的实现:kd树 1.构造kd树 ...

  7. 3. k 近邻法 k-NN

    1. k k k-NN k k k-NN 是一种基本的监督学习方法,它和感知机有些不同.具体地,它没有一个明确策略,也就是没有损失函数,因此它没有一个显式的学习过程. 1.1 模型概述 k k k-N ...

  8. scikit-learn K近邻法类库使用小结

    1. scikit-learn 中KNN相关的类库概述 在scikit-learn 中,与近邻法这一大类相关的类库都在sklearn.neighbors包之中.KNN分类树的类是KNeighborsC ...

  9. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  10. K 近邻法(K-Nearest Neighbor, K-NN)

    文章目录 1. k近邻算法 2. k近邻模型 2.1 模型 2.2 距离度量 2.2.1 距离计算代码 Python 2.3 kkk 值的选择 2.4 分类决策规则 3. 实现方法, kd树 3.1 ...

最新文章

  1. php解决 mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysq
  2. php网站点击按钮更新程序,php页面 点击按钮执行更新操作
  3. animate.css官网
  4. Linux Kernel 2.4 Internals
  5. linux查看端口被哪个服务占用的命令
  6. 最近谷歌苹果亚马逊扎堆收购的公司,会不会下一个就是你?
  7. 使用Docker Swarm来运行服务
  8. 鼎利测试软件 说明书,鼎利软件使用手册.docx
  9. 结构体初始化、结构体指针、结构体数组
  10. linux 下多个图片合并,FFmpeg将多张图片合成视频
  11. 计算机被管理员限制怎么解除,Win10系统管理员账户被禁用如何解除?
  12. 秘制祖传正宗四川麻辣烫锅底配方
  13. 大数(10^9)求欧拉数
  14. All the Windows 10 Technical Preview Editions ISO Direct Download Links !
  15. JavaScript基础学习——CSS预处理Less
  16. 计算机专业群名有内涵,好听又有内涵的群名推荐 诗意有文化
  17. iPhone6今发售被指已变味 加价倒手成黄牛圈钱工具
  18. 远程桌面,openGL
  19. [Excel知识技能] 排序功能
  20. androidstudio配置夜深模拟器

热门文章

  1. SQL SERVER 2005数据库镜像(上)
  2. SQLite3介绍及SQL语句详解(SQLite一)
  3. 百度网盘有linux客户端吗,bcloud-百度网盘Linux客户端
  4. 不用百度网盘客户端下载文件
  5. 字节跳动怎么都十万人了?
  6. ssm框架体检管理系统源码+文档
  7. vue项目动态拼接图片地址方法
  8. 房地产大数据分析方法
  9. python导入包的输入法_鼠须管输入法 傻瓜版配置 - 基于 rime_pro 增强包
  10. 如何系统学习Spring框架