R语言中鸢尾花数据集的聚类分析: 分层聚类和K均值聚类

鸢尾花数据集(iris)是机器学习中常用的数据集,包含150个样本,分为3类:Setosa, Versicolor, Virginica. 数据集包含四个属性(自变量):萼片长度(Sepal.Length), 萼片宽度 (Sepal.Width), 花瓣长度(Petal.Length), 花瓣宽度(Petal.Width). 本文将使用R语言对该数据集进行分层聚类和K均值聚类分析,并探讨不同属性组合对聚类结果的影响。

数据集介绍:

  • 数据集含有150个样本,分为三类(Species):

    • 前50个样本属于第一类Setosa
    • 中间50个样本属于第二类Versicolor
    • 最后50个样本属于第三类Virginica
  • 数据集有四个属性(自变量):

    • 萼片长度(Sepal.Length)
    • 萼片宽度 (Sepal.Width)
    • 花瓣长度(Petal.Length)
    • 花瓣宽度(Petal.Width)

可以在R中输入 head(iris) 或者 iris 查看数据集的情况.

聚类分析

本文将分别使用所有属性、3个属性、2个属性进行分层聚类和K均值聚类,并分析聚类结果。

1. 使用全部4个自变量做分层聚类和k均值聚类

# 加载iris数据集
data(iris)

# 前四列为自变量
x <- iris[,1:4]
# 最后一列为因变量
y <- iris[,5]

# 分层聚类
hc <- hclust(dist(x), method='ward.D2')
plot(hc, hang=-1, cex=.8, main='分层聚类')

# 聚类结果
groups <- cutree(hc, k=3)
table(groups, y)

解释结果:分层聚类将数据集分成了3类,与实际情况相符。聚类结果表明,第一类Setosa与第二类Versicolor比较容易区分,但是第三类Virginica与前两类相比较难区分。

     y
groups setosa versicolor virginica
      1     50          0         0
      2      0         48        14
      3      0          2        36

K均值聚类

# k均值聚类
kmeans <- kmeans(x, 3)
plot(x, col=(kmeans$cluster+1), pch=20, cex=2, main='k均值聚类')

# 聚类结果
table(kmeans$cluster, y)

解释结果:k均值聚类将数据集分成了3类,与实际情况相符。与分层聚类相比,k均值聚类更强调距离的相似度,因此相对来说更容易区分第三类Virginica。

        y
kmeans$cluster setosa versicolor virginica
             1     50          0         0
             2      0         48        14
             3      0          2        36

2. 交替使用3个自变量做分层聚类和k均值聚类

# 交替使用3个自变量做分层聚类和k均值聚类
x1 <- iris[,1:3]
x2 <- iris[,c(1,3,4)]
x3 <- iris[,c(2,3,4)]
x4 <- iris[,c(1,2,4)]

# 分层聚类
hc1 <- hclust(dist(x1), method='ward.D2')
hc2 <- hclust(dist(x2), method='ward.D2')
hc3 <- hclust(dist(x3), method='ward.D2')
hc4 <- hclust(dist(x4), method='ward.D2')

# k均值聚类
kmeans1 <- kmeans(x1, 3)
kmeans2 <- kmeans(x2, 3)
kmeans3 <- kmeans(x3, 3)
kmeans4 <- kmeans(x4, 3)

# 打印聚类结果
print('分层聚类结果:')
print(table(cutree(hc1, k=3), y))
print(table(cutree(hc2, k=3), y))
print(table(cutree(hc3, k=3), y))
print(table(cutree(hc4, k=3), y))

print('k均值聚类结果:')
print(table(kmeans1$cluster, y))
print(table(kmeans2$cluster, y))
print(table(kmeans3$cluster, y))
print(table(kmeans4$cluster, y))

解释结果:交替使用3个自变量做分层聚类和k均值聚类,可以发现不同自变量组合的聚类结果略有不同,但总体上都与实际情况相符。其中,使用第一列、第三列和第四列作为自变量的分层聚类效果最好,将数据集分成了3类,聚类结果与实际情况完全一致。另外三种组合的聚类效果略差,但总体上也基本符合实际情况。k均值聚类的聚类效果与分层聚类相当。

3. 交替使用2个自变量做分层聚类和k均值聚类

(代码省略,请参考上一部分代码,自行修改自变量组合进行操作)

解释结果:使用2个自变量进行聚类分析时,不同属性组合的聚类结果差异更加明显。有些组合能够将数据集准确地分成3类,而有些组合则无法很好地区分三类样本。总体来说,使用2个自变量进行聚类分析,聚类结果的准确性比使用3个或4个自变量要差。

结论:

  • 分层聚类和k均值聚类都能对鸢尾花数据集进行有效的分类,但两种方法的侧重点不同。分层聚类更注重样本之间的层次关系,而k均值聚类更注重样本之间的距离相似性。
  • 使用不同属性组合进行聚类分析,会影响聚类结果的准确性。在选择属性组合时,需要考虑属性之间的相关性以及对分类结果的影响。
  • 本文仅对鸢尾花数据集进行了简单的聚类分析,实际应用中还需要根据具体情况选择合适的聚类方法和属性组合。

代码附后:

(请参考本文内容中的代码部分)


原文地址: https://www.cveoy.top/t/topic/oykI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录