如何在每个节点中的SOM图上获取群集数?

时间:2019-01-30 22:39:15

标签: r cluster-analysis som

我想了解获得索姆图后我的酒连接到哪个节点。

这就是为什么我们首先需要获取带有wine名称和wine所属簇数的data.frame的原因。下一步将是查看该图中的聚类数。但IDK的如何:)

data(wines)
View(wines)    
#adding id for each wine

wines<-as.data.frame(wines)
wines$ID <- seq.int(nrow(wines))

#substract the id to know the "name" of wine

som_wines<-wines[,-14]
som_model<-som(scale(som_wines), grid = somgrid(5, 5, "hexagonal"))
som_codes<-as.data.frame(som_model$codes)

#ilustrating needed quantity of clusters

mydata <- as.data.frame(som_model$codes)
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var)) 
for (i in 2:15) {
  wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
}
plot(wss)

#som plot

som_cluster <- cutree(hclust(dist(som_codes)), 3)
plot(som_model, type="codes",bgcol= som_cluster, main = "Clusters") 
add.cluster.boundaries(som_model, som_cluster)   ` 

#Here we got 3 clusters. Creating the dataframe which defines wines id's to cluster groups.

cluster_details <- data.frame(id=wines$ID, cluster=som_cluster[som_model$unit.classif])

现在我希望在som图上显示簇数。有什么建议如何应对吗?将不胜感激任何答案:)

2 个答案:

答案 0 :(得分:1)

您可以通过调用模型的变量unit.classif来检查每个观测值属于哪个节点。 根据脚本,将模型分配给som_model。因此,您可以致电

som_model$unit.classif

向量按数据的行顺序排序,即您的第一个输入数据属于由第一个unit.classif向量值表示的节点,依此类推。 您可以通过致电

进行检查
length(som_model$unit.classif)
nrow(som_wines)

它们的长度相同。 该库将节点排列在一个维数为(节点x特征)的矩阵中。 如果将模型定义为具有5x5节点,而数据具有13个要素,那么模型的节点将表示为25x13矩阵。 您可以通过致电进行检查

dim(som_model$codes[[1]])

在地图上,节点从左下到右上对齐。代码映射的第一个节点位于左下方,第25个节点位于右上方。 因此,如果您想知道特定数据所属的节点的位置,可以将脚本扩展为以下内容:

from.bottom <- ceiling(som_model$unit.classif / som_model$grid$xdim)
from.left <- som_model$unit.classif %% som_model$grid$xdim
from.left[from.left == 0] <-  som_model$grid$xdim

cluster_details <- cbind(
  cluster_details, som.unit = som_model$unit.classif,
  from.bottom = from.bottom, from.left = from.left
)

(cluster_details)

答案 1 :(得分:0)

答案就在这里:https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html

特别是在这些行中:

SomModel <- som(
    data = TrainingMatrix,
    grid = GridDefinition,
    rlen = 10000,
    alpha = c(0.05, 0.01),
    keep.data = TRUE
)

nb <- table(SomModel$unit.classif)
groups = 5
tree.hc = cutree(hclust(d=dist(SomModel$codes[[1]]),method="ward.D2",members=nb),groups)


result <- OrginalData
result$Cluster <- tree.hc[SomModel$unit.classif]
result$X <- SomModel$grid$pts[SomModel$unit.classif,"x"]
result$Y <- SomModel$grid$pts[SomModel$unit.classif,"y"]