机器学习算法(k邻近算法)无代码纯理论版

  • k邻近算法

K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法,是一种常用的监督学习方法, 总体来说KNN算法是相对比较容易理解的算法

1.1定义

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

1.2距离公式:特征空间的邻近值可以用两个样本的距离代替
  1. 欧氏距离:c=\sqrt{x^{2}+y^{2}}(x,y 分别为在x轴、y轴的变化量)
  2. 曼哈顿距离(Manhattan Distance)  d=|x1-x2|+|y1-y2|
  3. 切比雪夫距离 (Chebyshev Distance) d=max(|x1-x2|,|y1-y2|)

以上三种都属于闵可夫斯距离的特殊情况,都存在明显的缺点:

                (1)将各个分量的量纲(scale),也就是“单位”相同的看待了;

                (2)未考虑各个分量的分布(期望,方差等)可能是不同的

比如:二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50), b(190,50),(180,60)。

a与b的闵氏距离==a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。

        4.标准化欧氏距离 ,针对上面的缺点做出改进

1.3 KNN算法流程总结

1)计算已知类别数据集中的点与当前点之间的距离

2)按距离递增次序排序

3)选取与当前点距离最小的k个点

4)统计前k个点所在的类别出现的频率

5)返回前k个点出现频率最高的类别作为当前点的预测分类

1.4k值的选择:

k值过小:容易受到异常点的影响

k值过大:受到样本均衡的问题

实际应用中,k一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的k值。

1.5 kd树

k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找k近邻。

当训练集很大时,计算非常耗时。为了提高KNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数

 定义:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果AB距离很远,BC距离很近,那么AC的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。

kd(K-dimension tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构kd树是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量

例如二分查找 [1,2,3,4,5,6,7,8,9,]我们找元素9完全可以从中间划分后直接找较大的那一组,而不去找较小的那一组。

Kd树构造方法:

1)构造根结点;

2)通过递归的方法,不断地对k维空间进行切分,生成子结点。

 超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一 个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。

3)上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。

通常,循环的选择坐标轴对空间切分选择训练实例点在坐标轴上 的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一 棵空树或其左子树和右子树的深度之差的绝对值不超过1,且它的 左子树和右子树都是平衡二叉树)

KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树 每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。

 在构建KD树时,关键需要解决2个问题:

1)选择向量的哪一维进行划分;

2)如何划分数据;

第一个问题简单的解决方法可以是随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来 衡量)。

第二个问题中,好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分

案例分析:

给定一个二维空间数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构

造一个平衡kd树。

  1. 先看x轴坐标排序:T=>{(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)}
  2. 按照x中间的值7划分为两(2,3),(4,7),(5,4) 、(8,1),(9,6)
  3. 这两组再分别以y轴划分:(2,3),(5,4)(4,7),   (8,1) ,(9,6)
  4. 划分完后,在根据x轴划分
最近邻域的搜索

假设标记的点是 test point,A 是找到的近似点,在回溯过程中,要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere,如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。

总结:

kd树的构建过程

  1. .构造根节点
  2. 通过递归的方法,不断地对k维空间进行切分,生成子节点
  3. 重复第二步骤,直到子区域中没有示例时终止
  4. 需要关注细节:a.选择向量的哪一维进行划分;b.如何划分数据

kd树的搜索过程

  • 二叉树搜索比较待查询节点和分裂节点的分裂维的值,(小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点)
  • 顺着“搜索路径”找到最近邻的近似点
  • 回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结 点空间中去搜索
  • 重复这个过程直到搜索路径为空

1.5实现:

1.获取数据集

2.数据基本处理

3.特征工程  -----》归一化标准化

4.机器学习(模型训练)

5.模型评估

 缺点:
#惰性学习
    KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多
#类别评分不是规格化
    不像一些通过概率评分的分类
#输出可解释性不强
#对不均衡的样本不擅长
    当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
#计算量较大
    目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本
优点
#简单有效
#重新训练的代价低
#适合类域交叉样本
KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
#适合大样本自动分类
该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值