📜  R 编程中的 K-Means 聚类(1)

📅  最后修改于: 2023-12-03 15:19:40.844000             🧑  作者: Mango

R编程中的K-Means聚类

1. 什么是K-Means聚类

K-Means聚类是一种无监督学习方法,用于将数据点分成不同的簇(cluster)或组。

K-Means聚类的思想如下:

  • 首先选择K个质心(centroids),通常随机选择或通过一定的方法进行初始化。
  • 将每个数据点分配到离它最近的质心所在的簇。
  • 对每个簇取平均值,将它们作为新的质心。
  • 重复以上两步,直到质心不再移动或是达到设定的最大迭代次数。

K-Means聚类的优点是简单易用,计算效率高,适用于大规模数据集。缺点是需要提前确定簇的个数K,并且对初始质心的选择非常敏感。

2. 如何使用R实现K-Means聚类

在R中,使用kmeans()函数来实现K-Means聚类。以下是一个简单的例子:

# 生成一个包含两个簇、每个簇有300个点的数据集
set.seed(123)
x <- rbind(
  # 第一个簇中心在(-10,-10),标准差为3
  matrix(rnorm(300,mean=-10,sd=3),ncol=2),
  # 第二个簇中心在(10,10),标准差为3
  matrix(rnorm(300,mean=10,sd=3),ncol=2)
)

# 进行K-Means聚类,设定簇的个数K为2
kmeans_result <- kmeans(x, centers=2)

# 绘制聚类结果
plot(x, col=kmeans_result$cluster)
points(kmeans_result$centers, col=1:2, pch=8, cex=2)

kmeans_result.png

上述代码中,先生成了两个簇、每个簇有300个点的数据集。然后使用kmeans()函数进行聚类,设定簇的个数K为2。最后绘制聚类结果,红色和蓝色的点分别表示两个簇的数据点,红色和蓝色的叉分别表示两个簇的中心。

另外,kmeans()函数还有许多参数可以设置,比如迭代次数(nstart)、距离度量方法(metric)、初始化方法(algorithm)等。可以通过help(kmeans)查看详细说明。

3. 如何选择最优的簇的个数K

K-Means聚类需要事先设定簇的个数K,但是 K 的选择并不容易。如果 K 太小,可能会丢失数据的趋势和特征;如果 K 太大,可能会产生噪音或无意义的聚类。

通常,我们可以使用肘部法(elbow method)或轮廓系数(silhouette coefficient)来选择最优的簇的个数K。

肘部法就是绘制不同的 K 值和对应的聚类SSE(sum of square error),并观察SSE和K的曲线。当K增大时,SSE会逐渐减小,但是在某个 K 值处,SSE的下降幅度会迅速变缓,形成一个肘部,这个肘部所对应的 K 值就是最优的簇的个数。

以下是一个例子:

set.seed(123)
x <- rbind(
  matrix(rnorm(300,mean=-10,sd=3),ncol=2),
  matrix(rnorm(300,mean=10,sd=3),ncol=2)
)

# 计算K=1至10时的聚类SSE
sse <- c()
for(k in 1:10){
  kmeans_result <- kmeans(x, centers=k, nstart=50)
  sse[k] <- kmeans_result$tot.withinss
}

# 绘制SSE和K的曲线
plot(sse ~ 1:10, type="b", xlab="Number of clusters", ylab="SSE")

sse_curve.png

根据上图,可以看出K值为2时出现一个明显的肘部,因此最优的簇的个数为2。

轮廓系数是一种评估聚类质量的指标,它能够同时考虑聚类的紧密度和分离度。轮廓系数的取值范围是[-1,1],越接近1表示聚类效果越好,越接近-1表示聚类效果越差。

以下是一个例子:

set.seed(123)
x <- rbind(
  matrix(rnorm(300,mean=-10,sd=3),ncol=2),
  matrix(rnorm(300,mean=10,sd=3),ncol=2)
)

# 计算K=2至10时的轮廓系数
library(cluster)
silhouette <- c()
for(k in 2:10){
  kmeans_result <- kmeans(x, centers=k, nstart=50)
  silhouette[k] <- silhouette(kmeans_result$cluster, dist(x))
}

# 绘制轮廓系数和K的曲线
plot(silhouette ~ 2:10, type="b", xlab="Number of clusters", ylab="Silhouette coefficient")

silhouette_curve.png

根据上图,可以看出K值为2时轮廓系数最高,因此最优的簇的个数为2。

注意,轮廓系数需要借助cluster包来计算,因此需要先安装和加载cluster包。

4. 总结

K-Means聚类是一种无监督学习方法,可用于将数据点分成不同的簇。在R中,使用kmeans()函数实现K-Means聚类,使用肘部法或轮廓系数来选择最优的簇的个数K。