📅  最后修改于: 2023-12-03 15:19:40.844000             🧑  作者: Mango
K-Means聚类是一种无监督学习方法,用于将数据点分成不同的簇(cluster)或组。
K-Means聚类的思想如下:
K-Means聚类的优点是简单易用,计算效率高,适用于大规模数据集。缺点是需要提前确定簇的个数K,并且对初始质心的选择非常敏感。
在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)
上述代码中,先生成了两个簇、每个簇有300个点的数据集。然后使用kmeans()函数进行聚类,设定簇的个数K为2。最后绘制聚类结果,红色和蓝色的点分别表示两个簇的数据点,红色和蓝色的叉分别表示两个簇的中心。
另外,kmeans()函数还有许多参数可以设置,比如迭代次数(nstart)、距离度量方法(metric)、初始化方法(algorithm)等。可以通过help(kmeans)查看详细说明。
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")
根据上图,可以看出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")
根据上图,可以看出K值为2时轮廓系数最高,因此最优的簇的个数为2。
注意,轮廓系数需要借助cluster包来计算,因此需要先安装和加载cluster包。
K-Means聚类是一种无监督学习方法,可用于将数据点分成不同的簇。在R中,使用kmeans()函数实现K-Means聚类,使用肘部法或轮廓系数来选择最优的簇的个数K。