K-means 聚类及其改进
K-means 是一种常用的聚类算法,算法简单易懂,在簇为凸形状时有较好的聚类效果。本文介绍了 K-means 算法的算法实现及优缺点,并介绍了 K-means 系列算法中常见的改进:K-modes,K-prototypes,K-medoids(PAM),CLARA,CLARANS.
更多算法请见这里:2024 数学建模国赛 C 题攻略(无废话版)
K-means
K-means 是一种常用的聚类算法,它将数据点分为 K 个不同的簇,使得同一簇内的数据点彼此相似度较高,而不同簇之间的数据点相似度较低。K-means 算法的基本思想是通过迭代优化质心位置,将数据点划分到与其最近的质心所属的簇中。
伪代码
Input: 数据集 D, 质心个数 K
# 初始化步骤
1. 从数据集 D 中随机选择 K 个数据点作为初始质心 C
2. 设置迭代次数 t = 0
3. 设置停止条件或最大迭代次数 T_max
# 迭代更新步骤
while t < T_max:
# 步骤 1: 分配数据点到最近的质心所属的簇
for each data point x in D:
计算 x 到每个质心 c_i 的距离 dist_i
将 x 分配到距离最近的质心所属的簇 cluster_i
# 步骤 2: 更新质心位置
for each cluster_i:
计算该簇中所有数据点的均值 mean_i
将 mean_i 更新为新的质心位置
# 步骤 3: 检查停止条件
如果质心位置的变化小于阈值,或者达到最大迭代次数,则停止迭代
否则增加迭代次数 t = t + 1
Output: 最终的簇划分和质心位置
优缺点分析
优点
- 简单而高效:K-means 算法简单易懂,易于实现,并且在大规模数据集上具有高效性能。
- 易于解释:K-means 算法生成的簇划分结果相对容易理解和解释,有利于对数据的分析和可视化。
- 可扩展性:K-means 算法可以适用于各种类型的数据,包括数值型和离散型数据。
缺点
- 需要指定簇个数:K-means 算法在使用时需要预先指定簇的个数 K,这对于一些数据集来说可能不够灵活。
- 对初始质心敏感:K-means 算法的性能受初始质心选择的影响较大,不同的初始质心可能会得到不同的结果。
- 对异常值敏感:K-means 算法对异常值较为敏感,异常值可能会影响簇的划分结果和质心位置。
- 非凸形状簇效果差:K-means 算法假设簇为凸形状,对于非凸形状的簇效果可能较差。
通过聚类分析评价指标确定K值
当我们无法直接确定K的具体取值时,可以给定一个K的范围,遍历这个范围内的所有K,计算每一个K对应的评价指标,取其中聚类效果最好的K值。常见的聚类分析评价准则有:邓恩系数,轮廓系数。
K-modes
在 K-means 算法中,使用欧氏距离作为两个样本之间的距离度量,这种度量方式不能直接用于类别变量。K-modes 弃用欧氏距离,选