如何使用R应用分层或k均值聚类分析?

| 我想对R应用分层聚类分析。我知道
hclust()
函数,但实际上却不知道如何使用它。我一直坚持将数据提供给函数并处理输出。 我还想将层次聚类与“ 1”产生的聚类进行比较。同样,我不确定如何调用此函数或使用/操作其输出。 我的数据类似于:
## dummy data
require(MASS)
set.seed(1)
dat <- data.frame(mvrnorm(100, mu = c(2,6,3), 
                          Sigma = matrix(c(10,   2,   4,
                                            2,   3, 0.5,
                                            4, 0.5,   2), ncol = 3)))
    
已邀请:
对于层次聚类分析,请仔细阅读
?hclust
并运行其示例。 R附带的群集程序包中包含替代功能。k-means群集在功能
kmeans()
cluster
包中可用。 将对显示的虚拟数据进行简单的层次聚类分析,如下所示:
## dummy data first
require(MASS)
set.seed(1)
dat <- data.frame(mvrnorm(100, mu = c(2,6,3), 
                          Sigma = matrix(c(10,   2,   4,
                                            2,   3, 0.5,
                                            4, 0.5,   2), ncol = 3)))
使用欧几里得距离计算相异矩阵(您可以使用任意距离)
dij <- dist(scale(dat, center = TRUE, scale = TRUE))
然后将它们聚类,例如使用群组平均分层方法
clust <- hclust(dij, method = \"average\")
打印结果给我们:
R> clust

Call:
hclust(d = dij, method = \"average\")

Cluster method   : average 
Distance         : euclidean 
Number of objects: 100
Plot the dendrogram
但是简单的输出掩盖了一个复杂的对象,该对象需要进一步的功能来提取或使用其中包含的信息:
R> str(clust)
List of 7
 $ merge      : int [1:99, 1:2] -12 -17 -40 -30 -73 -23 1 -52 -91 -45 ...
 $ height     : num [1:99] 0.0451 0.0807 0.12 0.1233 0.1445 ...
 $ order      : int [1:100] 84 14 24 67 46 34 49 36 41 52 ...
 $ labels     : NULL
 $ method     : chr \"average\"
 $ call       : language hclust(d = dij, method = \"average\")
 $ dist.method: chr \"euclidean\"
 - attr(*, \"class\")= chr \"hclust\"
可以使用
plot()
方法生成树状图(
hang
沿x轴在树状图的底部获取标签,and13ѭ只是将所有标签缩小到70%或正常)
plot(clust, hang = -0.01, cex = 0.7)
假设我们需要一个3集群解决方案,将树状图切割成3组并返回集群成员
R> cutree(clust, k = 3)
  [1] 1 2 1 2 2 3 2 2 2 3 2 2 3 1 2 2 2 2 2 2 2 2 2 1 2 3 2 1 1 2 2 2 2 1 1 1 1
 [38] 2 2 2 1 3 2 2 1 1 3 2 1 2 2 1 2 1 2 2 3 1 2 3 2 2 2 3 1 3 1 2 2 2 3 1 2 1
 [75] 1 2 3 3 3 3 1 3 2 1 2 2 2 1 2 2 1 2 2 2 2 2 3 1 1 1
也就是说,
cutree()
返回一个向量,该向量的长度与聚类的观察数相同,其元素包含每个观察所属的组ID。隶属度是将树状图切成指定高度或按适当高度切割以提供指定数量的组时,每个观测值落入的叶子的ID。 也许那给你足够的余地了? 对于k均值,我们会这样做
set.seed(2) ## *k*-means uses a random start
klust <- kmeans(scale(dat, center = TRUE, scale = TRUE), centers = 3)
klust
这使
> klust
K-means clustering with 3 clusters of sizes 41, 27, 32

Cluster means:
           X1          X2          X3
1  0.04467551  0.69925741 -0.02678733
2  1.11018549 -0.01169576  1.16870206
3 -0.99395950 -0.88605526 -0.95177110

Clustering vector:
  [1] 3 1 3 2 2 3 1 1 1 1 2 1 1 3 2 3 1 2 1 2 2 1 1 3 2 1 1 3 3 1 2 2 1 3 3 3 3
 [38] 1 2 2 3 1 2 2 3 3 1 2 3 2 1 3 1 3 2 2 1 3 2 1 2 1 1 1 3 1 3 2 1 2 1 3 1 3
 [75] 3 1 1 1 1 1 3 1 2 3 1 1 1 3 1 1 3 2 2 1 2 2 3 3 3 3

Within cluster sum of squares by cluster:
[1] 47.27597 31.52213 42.15803
 (between_SS / total_SS =  59.3 %)

Available components:

[1] \"cluster\"      \"centers\"      \"totss\"        \"withinss\"     \"tot.withinss\"
[6] \"betweenss\"    \"size\"
在这里,我们获得了有关由“ 1”返回的对象中的组件的一些信息。
$cluster
分量将产生隶属度向量,与我们先前从
cutree()
看到的输出相当:
R> klust$cluster
  [1] 3 1 3 2 2 3 1 1 1 1 2 1 1 3 2 3 1 2 1 2 2 1 1 3 2 1 1 3 3 1 2 2 1 3 3 3 3
 [38] 1 2 2 3 1 2 2 3 3 1 2 3 2 1 3 1 3 2 2 1 3 2 1 2 1 1 1 3 1 3 2 1 2 1 3 1 3
 [75] 3 1 1 1 1 1 3 1 2 3 1 1 1 3 1 1 3 2 2 1 2 2 3 3 3 3
在这两种情况下,请注意,我还对数据进行了缩放(标准化),以使每个变量都可以在通用范围内进行比较。对于以不同的“单位”或不同的尺度(如此处具有不同的均值和方差)测量的数据,如果结果有意义或不以方差较大的变量为主导,则这是重要的数据处理步骤。     

要回复问题请先登录注册