内容来自B站Up主:风中摇曳的小萝卜https://www.bilibili.com/video/BV1vA4y1o72F,仅为个人学习所用。
问题导入
有这样一个分类问题,有两类节点,三个属于A类,两个属于B类。现在有一个新的点橙色点,那么它属于A类还是B类?

很自然的想到,若橙色点更靠近A类,则该点属于A类,反之属于B类。
如果我们有这样的策略:
- 选择以该点最近的三个点为参考
- 遵守少数服从多数,领域类A有1个,B有2个,可以得出该点属于B类。

K近邻法
三个要素
距离度量:距离远近
特征空间中两个实例点的距离是两个实例点相似程度的反映。
k 近邻法中常用的距离度量有欧氏距离、曼哈顿距离等。
设图中有两点A和B。

欧氏距离是最常见的距离度量方法,它是在 n 维空间中两点之间的直线距离;如图,表现为AB之间的直线距离(绿色线)。
曼哈顿距离是在网格状空间中两点之间的最短距离,也称为出租车距离;如图,表现为两点在南北方向上的距离加上在东西方向上的距离(红色线),即d(i,j)=|xi-xj|+|yi-yj|。
蓝色线与黄色线为等价的曼哈顿距离。
K值:参考点的数量
k 值的大小直接影响着模型的复杂度和泛化能力。
若k值较小,进行预测时,只考虑训练数据中离待预测实例最近的少数几个样本,模型会变得复杂,对训练数据的拟合程度高,但可能会过拟合,对新数据的泛化能力较差;
若k值较大,模型会变得简单,考虑的训练样本较多,平滑效果好,能减少估计误差,但近似误差可能会增大,即对训练数据的拟合不够准确。
k值一般取奇数,避免分类平局。在分类问题中,当 k 值为偶数时,可能会出现两类样本数量相同的情况,导致分类结果出现平局,难以确定最终的类别。而选择奇数的 k 值,可以避免这种平局情况的发生,使得分类结果更加明确
分类决策规则:少数服从多数
在领域内,待分类的点的分类按照哪一个的样本类别相对于其他的样本类别多,就分类为哪一个类别。
描述语言

- T:数据集
- (x1,y1)…(xn,yn):每一个(x,y)都是一个样本
- x1…xn:样本特征
- y1…yn:样本类别

- 待分类样本称为(x,y)
算法步骤
- 根据距离度量和k值计算x的领域。该领域称为Nₖ(x)。如下图,划分出了样本x的邻域。

- 根据分类决策规则计算x的样本类别y。如上图,样本x的邻域中A类别有1个,B类别有2个,认为待分类样本为B类别。
如何计算样本x的最小距离样本
简单方法
- 计算每一个点到x的距离,并保存在数组中。
- 将数组排序,选取前k个即为x的邻域。

该方法简朴,但不够高效。
kd树
如图,以该7个点为例,需要知道7个点的二维坐标。

- 首先以x轴为标准,找到7个样本中x轴的中位数。只看x轴,中位数是479,为4节点,将节点4作为kd树的根节点。
- 以节点4的x轴为界,将平面分为左右两个部分。

- 看左边的部分,现在以y轴为标准,找到左边部分y轴的中位数721,是节点1。将左边部分继续划分为两个部分。将节点1添加到kd树中。

- 继续左上块部分,发现只有一个节点2,添加到kd树中,并认为是叶节点。(若不仅仅只有一个节点,按照上述步骤继续划分)
- 继续左下角部分,发现只有一个节点3,添加到kd树中,并认为是叶节点。
- 继续右侧部分,这里不再累述。
最后构建的kd树如图:

现在有个x样本如图:

- 从根节点出发,以x为标准,发现438<479,遍历左子树,到节点1。
- 以y为标准,发现681<721,遍历左子树,到叶节点2。
- 暂时认为节点2是距离x最近的节点,以节点x到节点2为半径画出查找范围(一个圆)

- 回溯kd树到节点1,节点1的平面(荧光部分,注意不要被节点1上画的横线给骗了)与该圆相交,计算节点1到x的距离,发现值更小,更新最小距离样本和查找范围。

- 更新后的查找范围中,节点1的另一个子节点节点3所在的平面和查找范围相交,故进入节点3。

- 遍历到节点3,计算节点3到x的距离,发现值更小,更新最小距离样本和查找范围。

- 回溯到节点4,计算节点4到x的距离,发现值较大,不更新查找范围。
- 根节点4的另一个子节点6所在的平面与查找范围相交,故进入节点6。计算节点6到x的距离,不需要更新最小距离样本和查找范围。

- 节点6的一个左子节点5所在的平面与该查找范围无关系,不需要进入节点5;而另一个子节点7所在的平面与该查找范围相交,进入节点7,计算节点7到x的距离,不需要更新最小距离样本和查找范围。

最后,得出与x最近的样本为节点3。
可以看到,在上述过程中,对节点5并未做计算,因此,在计算过程中,kd树可以减少计算量。
kd树检索的时间复杂度为O(logn)。

1637

被折叠的 条评论
为什么被折叠?



