当我尝试在标准虹膜数据上进行K-means聚类时
library('tidyverse')
iris_Cluster <- kmeans(iris[, 3:4], 2, nstart = 10)
iris$cluster <- as.factor(iris_Cluster$cluster)
p_iris <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color=cluster)) + geom_point()
print(p_iris)
我得到一个属于错误集群的点。问题是什么?这是K-means聚类算法的弱点吗?如何获得适当的结果?什么是分区聚类的好算法?
答案 0 :(得分:1)
是的,通过平方和物镜,这个点属于红色星团。
考虑一下,例如,DBSCAN。
答案 1 :(得分:1)
属于“错误”群集的点是第99点。 它有Petal.Length = 3和Petal.Width = 1.1。你可以得到 来自
的群集中心iris_Cluster$centers
Petal.Length Petal.Width
1 4.925253 1.6818182
2 1.492157 0.2627451
您可以使用
查看从点99到群集中心的距离as.matrix(dist(rbind(iris_Cluster$centers, iris[99,3:4])))
1 2 99
1 0.000000 3.714824 2.011246
2 3.714824 0.000000 1.724699
99 2.011246 1.724699 0.000000
点99 更接近集群中心(1.49,0.26)。 问题是k-means选择了集群中心 最接近一个点,而不是基于事物有意义的中心 喜欢附近点的集群。正如@ Anony-Mousse所说, DBSCAN可能更符合您的喜好。 DB部分代表基于密度 它创建了可以通过点连接点的集群 高密度区域。另一种选择是单链路分层 聚类往往会使得彼此靠近的点 相同的集群。
使用hclust
模仿您的代码:
library(ggplot2)
iris_HC <- hclust(dist(iris[,3:4]), method="single")
iris_Cluster <- cutree(iris_HC, 2)
iris$cluster <- as.factor(iris_Cluster)
p_iris <- ggplot(iris, aes(x=Petal.Length, y=Petal.Width, color=cluster)) + geom_point()
print(p_iris)