微信登录

聚类分析 - K means 聚类 - 进行 K means 聚类

聚类分析 - K means 聚类 - 进行 K means 聚类

一、引言

在数据挖掘和机器学习领域,聚类分析是一种重要的无监督学习方法,它能够将数据集中相似的数据点划分到不同的组或簇中。K means 聚类是最常用的聚类算法之一,它简单易懂、计算效率高,广泛应用于图像分割、客户细分、市场分析等众多领域。本文将详细介绍 K means 聚类的原理、实现步骤,并通过 R 语言代码进行演示。

二、K means 聚类原理

K means 聚类的目标是将 $n$ 个样本点划分为 $k$ 个不同的簇,使得簇内的样本点相似度尽可能高,而簇间的相似度尽可能低。具体步骤如下:

  1. 初始化:随机选择 $k$ 个样本点作为初始的聚类中心。
  2. 分配样本:计算每个样本点到各个聚类中心的距离,将样本点分配到距离最近的聚类中心所在的簇。
  3. 更新聚类中心:对于每个簇,计算该簇内所有样本点的均值,将均值作为新的聚类中心。
  4. 重复步骤 2 和 3:直到聚类中心不再发生变化或达到最大迭代次数。

三、R 语言实现 K means 聚类

示例数据

我们使用 R 语言内置的 iris 数据集进行演示,该数据集包含了 150 个鸢尾花样本,每个样本有 4 个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),以及对应的鸢尾花品种。

代码实现

  1. # 加载 iris 数据集
  2. data(iris)
  3. # 提取特征数据,去除品种标签
  4. iris_features <- iris[, 1:4]
  5. # 设置聚类的簇数,这里我们选择 3,因为 iris 数据集有 3 个品种
  6. k <- 3
  7. # 进行 K means 聚类
  8. kmeans_result <- kmeans(iris_features, centers = k)
  9. # 查看聚类结果
  10. print(kmeans_result)
  11. # 可视化聚类结果
  12. library(cluster)
  13. clusplot(iris_features, kmeans_result$cluster,
  14. color = TRUE, shade = TRUE,
  15. labels = 2, lines = 0)

代码解释

  1. 数据加载:使用 data(iris) 加载 iris 数据集,并提取前 4 列作为特征数据。
  2. 设置簇数:将簇数 $k$ 设置为 3,因为 iris 数据集有 3 个品种。
  3. 进行聚类:使用 kmeans() 函数进行 K means 聚类,指定特征数据和簇数。
  4. 查看结果:打印聚类结果,包括聚类中心、每个样本的聚类标签等信息。
  5. 可视化结果:使用 clusplot() 函数绘制聚类结果的散点图,直观展示聚类效果。

四、聚类结果评估

为了评估 K means 聚类的效果,我们可以使用一些指标,如轮廓系数(Silhouette Coefficient)。轮廓系数衡量了每个样本点与所在簇的紧密程度以及与其他簇的分离程度,取值范围为 $[-1, 1]$,值越接近 1 表示聚类效果越好。

  1. # 计算轮廓系数
  2. library(cluster)
  3. silhouette_result <- silhouette(kmeans_result$cluster, dist(iris_features))
  4. mean(silhouette_result[, 3])

五、K 值的选择

在 K means 聚类中,$k$ 值的选择非常重要,它直接影响聚类的效果。常用的选择 $k$ 值的方法有手肘法(Elbow Method)和轮廓系数法。

手肘法

手肘法通过绘制不同 $k$ 值下的簇内误差平方和(Within-cluster Sum of Squares, WSS)与 $k$ 的关系图,选择曲线的“手肘”位置作为最优的 $k$ 值。

  1. # 计算不同 k 值下的 WSS
  2. wss <- sapply(1:10, function(k) {
  3. kmeans(iris_features, centers = k)$tot.withinss
  4. })
  5. # 绘制 WSS 与 k 的关系图
  6. plot(1:10, wss, type = "b", xlab = "Number of clusters (k)", ylab = "Within-cluster sum of squares (WSS)")

轮廓系数法

轮廓系数法通过计算不同 $k$ 值下的平均轮廓系数,选择平均轮廓系数最大的 $k$ 值作为最优的 $k$ 值。

  1. # 计算不同 k 值下的平均轮廓系数
  2. silhouette_scores <- sapply(2:10, function(k) {
  3. kmeans_result <- kmeans(iris_features, centers = k)
  4. silhouette_result <- silhouette(kmeans_result$cluster, dist(iris_features))
  5. mean(silhouette_result[, 3])
  6. })
  7. # 绘制平均轮廓系数与 k 的关系图
  8. plot(2:10, silhouette_scores, type = "b", xlab = "Number of clusters (k)", ylab = "Average silhouette score")

六、总结

K means 聚类是一种简单有效的聚类算法,通过不断迭代更新聚类中心,将数据点划分为不同的簇。在实际应用中,我们需要根据具体问题选择合适的 $k$ 值,并使用合适的评估指标来评估聚类效果。

方法 优点 缺点
K means 聚类 简单易懂、计算效率高 对初始聚类中心敏感、需要预先指定 $k$ 值
手肘法 直观、易于理解 选择“手肘”位置存在主观性
轮廓系数法 客观、能够定量评估聚类效果 计算复杂度较高

希望本文能够帮助你理解 K means 聚类的原理和实现方法,并在实际项目中应用该算法。

聚类分析 - K means 聚类 - 进行 K means 聚类