这三个玩意,因为要么带K,要么带Mean,所以吗,放在一起介绍一下:
Meanshift
因为我本身是图像处理出身,最早接触的是Meanshift,其经常用于图像分割,目标跟踪等方面,下面首先说一下Meanshift:
算法步骤:
- 在未被标记的数据点中随机选择一个点作为起始中心点center;
- 找出以center为中心半径为radius的区域中出现的所有数据点,认为这些点同属于一个聚类C。同时在该聚类中记录数据点出现的次数加1。
- 以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加求平均值,得到向量shift。
- center = center + shift。即center沿着shift的方向移动,移动距离是||shift||。
- 重复步骤2、3、4,直到shift的很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇C1。
- 如果收敛时当前簇C的center与其它已经存在的簇C2中心的距离小于阈值,那么把C2和C合并,数据点出现次数也对应合并。否则,把C作为新的聚类。
- 重复1、2、3、4、5直到所有的点都被标记为已访问。
- 分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。
KMeans
算法步骤:
- 随机选取k个中心点。
- 遍历所有数据,将每个数据划分到最近的中心点中。
- 计算每个聚类的平均值,并作为新的中心点。
- 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代。
KNN
算法步骤:
- 计算测试数据与各个训练数据之间的距离。
- 按照距离的递增关系进行排序。
- 选取距离最小的K个点。
- 确定前K个点所在类别的出现频率。
- 返回前K个点中出现频率最高的类别作为测试数据的预测分类。
比较
KMeans与Meanshift是聚类算法,属于非监督学习,有前期的训练过程;
KNN是分类算法,监督学习,没有前期训练过程,一般通过KD对数据进行处理,以快速找到K个紧邻点。