30(1).原型聚类---k-means

原型聚类prototype-based clustering假设聚类结构能通过一组原型刻画。

常见的原型聚类有:

  1. k均值算法k-means
  2. 学习向量量化算法Learning Vector Quantization:LVQ
  3. 高斯混合聚类Mixture-of-Gaussian

一、k-means算法

1.k-means

1.1 给定样本集D={X1,X2,...,XN},假设一个划分为C={C1,C2,...,CK},定义该划分的平方误差为:

err=k=1Kx=1,XiCk||Xiuk||22,其中uk=1|Ck|XiCkXi是簇Ck的均值向量。

err刻画了簇类样本围绕簇均值向量的紧密程度,其值越小,则簇内样本相似度越高。

k-means算法的优化目标为:最小化err。即:minCk=1KXiCk||Xiuk||22

1.2 k-means的优化目标需要考察D的所有可能的划分,这是一个NP难的问题。实际上k-means采用贪心策略,通过迭代优化来近似分解。

  1. 首先假设一组均值向量。
  2. 然后根据假设的均值向量给出了D的一个划分。
  3. 再根据这个划分来计算真实的均值向量:
    1. 如果真实的均值向量等于假设的均值向量,则说明假设正确。根据假设均值向量给出的D的一个划分确实是原问题的解。
    2. 如果真实的均值向量不等于假设的均值向量,则可以将真实的均值向量作为新的假设均值向量,继续迭代求解。

1.3 给定一组假设的均值向量,如何计算出D的一个簇划分?

k-means算法的策略是:样本离哪个簇的均值向量最近,则该样本就划归到那个簇。

1.4 k-means算法:

输入:样本集D={X1,X2,...,XN},聚类簇数K

输出:簇划分C={C1,C2,...,CK}

算法步骤:

  1. D中随机选择K个样本作为初始均值向量{u1,u2,...,uK}
  2. 重复迭代直到算法收敛,迭代过程:
    1. 初始化阶段:取Ck=k=1,2,...,K
    2. 划分阶段:令i=1,2,...,N
      1. 计算Xi的簇标记:λi=argminkxiμk2,k{1,2,,K},即:将Xi离哪个簇的均值向量最近,则该样本就标记为那个簇
      2. 然后将样本Xi划入相应的簇:Cλi=CλiXi
    3. 重计算阶段:计算μ^k:μ^k=1|Ck|xiCkxi
    4. 终止条件判断:
      1. 如果对所有的k{1,2,...,K},都有uk^=uk,则算法收敛,终止迭代
      2. 否则重赋值uk=uk^

1.5 k-means优点:

  1. 计算复杂度低,为O(NKq),其中q为迭代次数。通常Kq要远远小于N,此时复杂度相当于O(N)
  2. 思想简单,容易实现。

1.6 k-means缺点:

  1. 需要确定聚类的数量K
  2. 分类结构严重依赖于分类中心的初始化。通常进行多次k-means,然后选择最优的那次作为最终聚类结构。
  3. 结果不一定是全局最优的,只能保证局部最优。
  4. 对噪声敏感。因为簇的中心是取平均,因此聚类簇很远地方的噪音会导致簇的中心点偏移。
  5. 无法解决不规则形状的聚类。
  6. 无法处理离散特征,如:国籍、性别等。

1.7 k-means性质:

  1. k-means实际上假设数据是呈现球形分布,实际任务中很少有这种情况。与之相比,GMM使用更加一般的数据表示,即高斯分布。
  2. k-means假设各个簇的先验概率相同,但是各个簇的数据量可能不均匀。
  3. k-means使用欧式距离来衡量样本与各个簇的相似度。这种距离实际上假设数据的各个维度对于相似度的作用是相同的。
  4. k-means中,各个样本点只属于与其相似度最高的那个簇,这实际上是分簇。
  5. k-means算法的迭代过程实际上等价于EM算法。

2.k-means++

2.1 k-means++属于k-means的变种,它主要解决k-means严重依赖于分类中心初始化的问题

2.2 k-means++选择初始均值向量时,尽量安排这些初始均值向量之间的距离尽可能的远。

2.3 k-means++算法:

输入:样本集D={X1,X2,...,XN},聚类簇数K

输出:簇划分C={C1,C2,...,CK}

算法步骤:

  1. D中随机选择1个样本作为初始均值向量组{u1}
  2. 迭代,直到初始均值向量组有K个向量。假设初始均值向量组为{u1,...,um}。迭代过程如下:
    1. 对每个样本Xi,分别计算其距u1,...,um的距离。这些距离的最小值记作di=minuj||Xiuj||
    2. 对样本Xi,其设置为初始均值向量的概率正比于di。即:离所有的初始均值向量越远,则越可能被选中为下一个初始均值向量。
    3. 以概率分布P={d1,d2,...,dN}(未归一化的)随机挑选一个样本作为下一个初始均值向量um+1
  3. 一旦挑选出初始均值向量组{u1,...,uK},剩下的迭代步骤与k-means相同。

3.k-modes

3.1 k-modes属于k-means的变种,它主要解决k-means无法处理离散特征的问题。

3.2 k-modes与k-means有两个不同点(假设所有特征都是离散特征):

  1. 距离函数不同。在k-modes算法中,距离函数为:distance(Xi,Xj)=d=1nI(xi,d=xj,d),其中I()为示性函数。上式的意义为:样本之间的距离等于他们之间不同属性值的个数。
  2. 簇中心的更新规则不同。在k-modes算法中,簇中心每个属性的取值为:簇内该属性出现频率最大的那个值μ^k,d=argmaxvxiCkI(xi,d=v),其中v的取值空间为所有样本在第d个属性上的取值。

4.k-medoids

4.1 k-medoids属于k-means的变种,它主要解决k-means对噪声敏感的问题

4.2 k-medoids算法:

输入:样本集D={X1,X2,...,XN},聚类簇数K

输出:簇划分C={C1,C2,...,CK}

算法步骤:

  1. D中随机选择K个样本作为初始均值向量{u1,u2,...,uK}
  2. 重复迭代直到算法收敛,迭代过程:
    1. 初始化阶段:取Ck=,k=1,2,...,K。遍历每个样本Xi,i=1,2,...,N,计算它的簇标记:λi=argmink||Xiuk||2,k{1,2,...,K}。即:将Xi离哪个簇的均值向量最近,则该样本就标记为那个簇。然后将样本Xi划入相应的簇:Cλi=Cλi{Xi}
    2. 重计算阶段:遍历每个簇Ck,k=1,2,...,K
      1. 计算簇新uk距离簇内其他点的距离du(k)=Xj(k)Ck||ukXj(k)||
      2. 计算簇Ck内每个点Xi(k)距离簇内其他点的距离di(k)=Xj(k)||Xi(k)Xj(k)||。如果di(k)<du(k),则重新设置簇中心:uk=Xi(k)du(k)=di(k)
    3. 终止条件判断:遍历一轮簇C1,...,CK之后,簇心保持不变

4.3 k-medoids 算法在计算新的簇心时,不再通过簇内样本的均值来实现,而是挑选簇内距离其它所有点都最近的样本来实现。这就减少了孤立噪声带来的影响。

4.4 k-medoids 算法复杂度较高,为O(N2) 。其中计算代价最高的是计算每个簇内每对样本之间的距离。 通常会在算法开始时计算一次,然后将结果缓存起来,以便后续重复使用。

5.mini-batch k-means

5.1 mini-batch k-means 属于 k-means 的变种,它主要用于减少k-means 的计算时间

5.2 mini-batch k-means 算法每次训练时随机抽取小批量的数据,然后用这个小批量数据训练。这种做法减少了k-means 的收敛时间,其效果略差于标准算法。

5.3  mini-batch k-means算法:

输入:样本数D={X1,X2,...,XN},聚类簇数K

输出:簇划分C={C1,C2,...,CK}

算法步骤:

  1. D中随机选择K个样本作为初始均值向量{u1,u2,...,uK}
  2. 重复迭代直到算法收敛,迭代过程:
    1. 初始化阶段:取Ck=k=1,2,...,K
    2. 划分阶段:随机挑选一个Batch的样本集合B=Xb1,...,XbM,其中,M为批大小
      1. 计算Xi,i=b1,...,bM的簇标记:λi=argminkxiμk2,k{1,2,,K},即:将Xi离哪个簇的均值向量最近,则该样本就标记为那个簇
      2. 然后将样本Xi,i=b1,...,bM划入相应的簇:Cλi=CλiXi
    3. 重计算阶段:计算μ^k:μ^k=1|Ck|xiCkxi
    4. 终止条件判断:
      1. 如果对所有的k{1,2,...,K},都有uk^=uk,则算法收敛,终止迭代
      2. 否则重赋值uk=uk^

 

 

posted @   nxf_rabbit75  阅读(694)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2018-11-23 参加Kaggle的经验总结(收藏)
2018-11-23 itertools模块(收藏)
2018-11-23 collections模块(收藏)
2018-11-23 1. 数据结构---链表
2018-11-23 查询set、dict、dict.keys()的速度对比
一、k-means算法1.k-means2.k-means++3.k-modes4.k-medoids5.mini-batch k-means
点击右上角即可分享
微信分享提示