机器学习(一)KNN与Kmeans总结

本文介绍了KNN(K近邻算法)和Kmeans算法,包括算法原理、关键点以及优缺点。KNN算法依赖K值选择和距离度量,采用多数表决进行分类决策。Kmeans是一种迭代的聚类算法,通过不断调整聚类中心来优化结果,但也存在K值预设困难和对初始中心敏感的问题。K-means++算法解决了初始中心选择问题。最后,讨论了KNN和Kmeans的区别,并简要介绍了优化方法KD-tree和Balltree。

一. 关于KNN算法(K近邻算法)

1.算法介绍:

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

2.算法要点

a) K值的选择:K值的选择会对结果产生重大影响。较小的K值可以减少近似误差,但是会增加估计误差;较大的K值可以减少估计误差,但是会增加近似误差。一般而言,通常采用交叉验证法来选取最优的K值。

  • 近似误差:可以理解为对现有训练集的训练误差,近似误差过小,可能出现过拟合现象。
  • 估计误差:可以理解为对测试集的训练误差,估计误差较小说明对未知数据的预测能力较好。模型本身最接近最佳模型。

b)距离的度量:距离反映了空间中两个实例的相似程度。

几种典型的距离表示
c) 分类决策规则:采用多数表决。

二. 关于Kmeans算法

1.算法介绍

K-means是一种基于距离的迭代算法。它将n个观察实例分类到k个聚类中,以使得每个观察实例距离它所在的聚类中心点比其他的聚类中心点的距离更小。

2.Kmeans算法步骤

a) 所有的观测实例中随机抽出K个观测点,作为聚类中心点,然后遍历其余的观测点找到距离各自最近的聚类中心点,将其加入到该聚类中,这样就得到了一个初始的结果。

b) 每个聚类中心都至少有一个观测实例,这样,可以求出每个聚类的中心点,作为新的聚类中心,然后再遍历所有的观测点,找到距离其最近的中心点,加入到该聚类中。然后继续步骤a);

c) 如此往复b),直到前后两次迭代迭代得到的聚类中心点一模一样。这样就完成了算法的最终结果。

在这里插入图片描述

在这里插入图片描述

  • 三个公式的求中心点的方式分别对应(1),(2),(3),第一个图以星形的方式,第二个图以同心圆的方式,第三个图以菱形的方式。

3.Kmeans算法的缺陷

聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。(可以使用Kmeans++算法来解决)

4.K-Means ++ 算法

k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

从输入的数据点集合中随机选择一个点作为第一个聚类中心对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大重复2和3直到k个聚类中心被选出来利用这k个初始的聚类中心来运行标准的k-means算法。

三. KNN与Kmeans的区别
在这里插入图片描述

四. KNN与Kmeans的通用优化函数 KD-tree vs all tree

1.KDtree
把n维特征的观测实例放到n维空间中,kdtree每次通过某种算法选择一个特征(坐标轴),以它的某一个值作为分界作为超平面,把当前所有观测点分为两个部分,然后对每一个部分使用相同的方法,直到达到某个条件为止。
a) 选择特征的方法

计算当前观测点几何中每个特征的方差,选择方差最大的一个特征,然后画一个垂直于这个特征的超平面将所有观测点分为两个集合。

b) 以该特征的哪一个值为界,即垂直选择坐标轴的超平面的具体位置。

第一种是以各个点的方差的中值为界。这样会使建好的树非常的平衡,会均匀地分开一个集合。这样做的问题是,如果点的分布非常不好地偏斜的,选择中值会造成连续相同方向的分割,形成细长的超矩形。

替代的方法是计算这些点该坐标的平均值,选择距离这个平均值最近的点作为超平面与这个坐标轴的交点。这样这个树不会完美的平衡,但区域会倾向于正方地被划分,连续的分割更有可能在不同方向上发生。

c) 达到什么样的条件算法结束

实际上,不用直到叶子节点只包含两个点时才结束算法。可以设定一个预先设定的最小值,当这个最小值达到时结束算法。
在这里插入图片描述
图1. 一个k-dtree划分二维空间

上图中,星号标注的是目标点,我们在k-d tree中找到这个点所处的区域后,依次计算此区域包含的点的距离,找出最近的一个点(黑色点),如果在其他region中还包含更近的点则一定在以这两个点为半径的圆中。假设这个圆如图中所示包含其他区域,再看这个区域的兄弟结点对应区域,与圆不重叠;再看其双亲结点的兄弟结点对应区域。从它的子节点对应区域中寻找(图中确实与这个双亲结点的兄弟结点的子节点对应区域重叠了)。在其中找是否有更近的结点。

K-dtree的优势是可以递增更新,新的观测点可以不断加入进来。找到新观测点应该在的区域,如果他是空的,就把它添加进去,否则,沿着最长的边分割这个区域来保持接近正方形的性质。这样会破坏树的平衡性,同时让区域不利于找最近邻。可以当树的深度到达一定值时重建这棵树。

k-d树存在问题:矩形并不是使用到的最好的方法。偏斜的数据集会造成我们想要保持树的平衡与保持区域的正方形特性的冲突。另外,矩形甚至是正方形并不是在这里最完美的形状,由于它的角。如果图中的圆再大一些,即黑点距离目标点再远一些,圆就会与左上角的矩形相交,需要多检查一个区域的点,而且那个区域是当前区域双亲结点的兄弟结点的子节点。

为了解决这个问题,引入了balltree结构。

2.Balltree

解决上面问题的方案就是使用超球面而不是超矩形划分区域。使用球面可能会造成球面间的重叠,但却没有关系。Balltree就是一个k维超球面来覆盖这些观测点,把他们放到树里面。图(a)显示了一个2维平面包含16个观测实例的图,图(b)是其对应的ball tree,其中结点中的数字表示包含的观测点数。

在这里插入图片描述
在这里插入图片描述

不同层次的圆被用不同的风格画出。树中的每个结点对应一个圆,结点的数字表示该区域保含的观测点数,但不一定就是图中该区域囊括的点数,因为有重叠的情况,并且一个观测点只能属于一个区域。实际的ball tree的结点保存圆心和半径。叶子结点保存它包含的观测点。
使用ball tree时,先自上而下找到包含target的叶子结点,从此结点中找到离它最近的观测点。这个距离就是最近邻的距离的上界。检查它的兄弟结点中是否包含比这个上界更小的观测点。方法是:如果目标点距离兄弟结点的圆心的距离大于这个圆的圆心加上前面的上界的值,则这个兄弟结点不可能包含所要的观测点。(如图2)否则,检查这个兄弟结点是否包含符合条件的观测点。
点与超圆
图2.点与超圆
ball tree的分割算法:
选择一个距离当前圆心最远的观测点i1,和距离i1最远的观测点 i2,将圆中所有离这两个点最近的观测点都赋给这两个簇的中心,然后计算每一个簇的中心点和包含所有其所属观测点的最小半径。对包含n个观测点的超圆进行分割,只需要线性的时间。
与k-d tree一样,如果结点包含的观测点到达了预先设定的最小值,这个顶点就可以不再分割了。

参考:
https://blog.csdn.net/skyline0623/article/details/8154911

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值