使用 R 实现 kmeans 聚类

数据挖掘 k-均值
2022-02-14 04:27:14

我已经在 R 中对 iris 数据集(内置数据集)实现了 kmeans 聚类。代码如下:

X=as.matrix(iris[-5]);

K=3;

prevCentroids=matrix(0,K,dim(X)[2]);
centroids=X[sample(1:dim(X)[1],K),];

dot=numeric(3);
C=numeric(150);

while(!isTRUE(all.equal(centroids,prevCentroids)))
{
  for(i in 1:dim(X)[1])
   {
    for(j in 1:dim(centroids)[1])
     {
       dot[j]=(X[i,]-centroids[j,])%*%(X[i,]-centroids[j,]);
     }
     C[i]=which.min(dot);
   }

  prevCentroids=centroids;

  for(k in 1:K)
   {
     centroids[k,]=colMeans(X[which(C==k),]);
   }
}

print(cbind(iris,C));

有时,使用这段代码,我可以得到 85% 的聚类正确率。但有时,如果我将它与已经聚集的内置虹膜数据集进行比较,它的正确率只有 37%。

谁能告诉我哪里出错了?

1个回答

实际上,这是在 iris 数据集上运行 k-means 算法的预期行为。iris 数据集仅包含两个不同的集群。因此,如果您随机设置三个质心,则第三个质心最终会出现在正确的簇上或错误的簇上,从而导致算法将该簇一分为二(见左图)。

您的准确率为 37% 的结果很可能看起来有点类似于左图,其中左簇已被分成两个簇。85% 的准确率很可能来自正确的集群被分成两个集群的那些时间(虽然没有打印结果,但您无法确定)。

Chire [公共领域],来自维基共享资源

出于测试目的,您可以set.seed(123)在运行算法之前简单地使用,这样您总是得到相同的结果。但是,这并不能解决 iris 数据集不适合聚类的问题。我建议您查看其他数据集,或者尝试使用 R-package cluster.datasets 。