Kmeans算法源码分析

最近看了下Kmeans算法的源码,层次非常清晰。下面主要是对Kmeans算法中的flags标识的不同的centers生成方法进行梳理。
Kmeans算法中有3中生成centers的算法,分别对应三个flags,KMEANS_RANDOM_CENTERS,KMEANS_PP_CENTERS,KMEANS_USE_INITIAL_LABELS三种。
KMEANS_RANDOM_CENTERS:每个attempts选择随机的初始中心。
KMEANS_PP_CENTERS:用Kmeans++算法
KMEANS_USE_INITIAL_LABELS:第一次attempts用用户提供的labels初始化中心,第二次以及第二次以后的attempts用随机或者半随机中心。
今天主要讲下flags=KMEANS_USE_INITIAL_LABELS时,源码的处理流程。

1)当iter==0时,用用户给定的labels初始化中心,并计算每个中心的样本数。否则,用上一次iter循环后的labels来计算新的中心centers

2)通过第一步统计结果,查找是否有聚类中心的样本数为0,如有,那么找到最大的聚类中心(样本数最多)Max_center;找到Max_center中距离中心点最远的样本;把这个样本点从Max_center中移除,并添加到样本数为0的聚类中心。这样,循环检测每一个聚类中心。生成新的new_centers

3)归一化centers和new_centers,并计算max_center_shift,取max_center_shift为所有聚类中心移动距离的最大值(这个聚类中心的移动距离就是L2距离)
注意:当Iter==0时,max_center_shift为DBL_MAX,这个其实是用户给定的labels初始化聚类中心。

4)计算每个样本值到new_centers的距离,并生成新的labels。然后循环到第一步。

循环终止条件是,当iter达到设定的值或者是当max_center_shift小于给定的精度epsilon时。循环终止,代表一个attempt计算结束。
一个attempt计算基数后,会计算一个compactness,compactness值为所有样本到其距离最近的center的距离之和。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值