算法笔记:Kmeans聚类算法简介

本文回顾了K-means算法的基本原理,包括其迭代过程、收敛性证明,介绍了cosine和点积距离版本的变体,并提供了基于sklearn和自定义实现的代码实例。涵盖了算法核心、优化与扩展以及实际应用。

1. Kmeans算法简介

Kmeans算是非常经典的一个聚类算法了,早已经被写到教科书里面了,不过很不幸的是,最近干活遇到了这个,然后我发现我已经忘得差不多一干二净了……

所以这里就过来挖个坟,考个古,把这玩意拉出来复习一下。

如前所述,Kmeans算法是一个聚类算法,具体来说,我们输入一个包含 N N N个点的点集,我们的目的是要将这 N N N个点分为 K K K个簇,使得每个点到各自的簇的中心距离之和最小。

用公式来表达的话就是:

s = ∑ i = 1 N m i n j ∈ { 1 , . . . , K } ( d ( x i , u j ) ) s = \sum_{i=1}^{N} \mathop{min}\limits_{j \in \{1, ..., K\}}(d(x_i, u_j)) s=i=1Nj{ 1,...,K}min(d(xi,uj))

要找到一组 u j u_j uj使得 s s s最大。

其中, d ( x , y ) d(x, y) d(x,y)表示 x , y x,y x,y两点间的距离,一般我们在这里使用欧氏距离。

2. Kmeans算法细节

Kmeans算法的核心思路是迭代。

首先,我们随机从 N N N个点当中选出 K K K个点作为簇的中心点。

然后,根据全部的 N N N个点到这 K K K个中心点之间的距离,我们就可以将这全部的 N N N个点进行分类,分配到这 K K K个簇当中。

而后,我们更新这 K K K个簇的中心,具体来说,我们取这 K K K个点的均值点作为这 K K K个簇的新的中心。

我们不断地重复上述两个步骤,直到达到迭代上限或者簇的中心点不再发生变化即可。

具体的,我们可以给出上述Kmeans算法的算法整理如下:

  1. step 1: 从 N N N个给定点当中随机 K K K个点作为 K K K个簇的中心点;
  2. step 2: 计算每一个点到这 K K K个簇的中心点之间的欧式距离,将其分配到最小的那个簇当中,从而对所有的点进行聚类;
  3. step 3: 对于2中得到的每一个簇,更新其中心点为所有点的均值,即 u = ∑ i x i n \bold{u} = \frac{\sum_i \bold{x}_i}{n} u=nixi
  4. step 4: 重复上述2-3两步,直到迭代次数达到上限或者簇的中心不再发生变化。

而Kmeans的算法的优缺点因此也就比较明显:

  1. 优点
    • 易实现,易debug
  2. 缺点
    • 迭代非常耗时,对于大数据量尤其明显;
    • 较依赖于初始化中心的选择,不同初始化中心点的选择会带来较大的结果差异;

3. Kmeans算法收敛性证明

现在,给出了kmeans聚类算法之后,我们来考察一下kmeans算法的收敛性,也就是说,为什么kmeans算法的迭代是有效的。

我们使用原始的kmeans算法进行说明,即是说,使用欧式距离来对两点间的距离进行描述,此时,前述提到的loss函数就可以表达为:

s = ∑ i = 1 N m i n j ∈ { 1 , . . . , K } ∣ ∣ x i , u j ∣ ∣ s = \sum_{i=1}^{N} \mathop{min}\limits_{j \in \{1, ..., K\}} ||x_i, u_j|| s=i=1Nj{ 1,...,K}min∣∣xi,uj∣∣

具体到第 k k k次迭代上,即有:

s k = ∑ i = 1 N m i n j ∣ ∣ x i , u j k ∣ ∣ s^{k} = \sum_{i=1}^{N} \mathop{min}\limits_{j} ||x_i, u_j^k|| sk=i=1Njmin∣∣xi,ujk∣∣

显然, s k s^{k} s

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值