如何在每个节点中获取 SOM 图上的簇数?
How to get the number of cluster on the SOM plot, in each of the node?
我想在得到som plot后了解我的wine连接到哪个节点。
这就是为什么我们首先需要 data.frame 得到葡萄酒的名称和葡萄酒所属的簇数。下一步是查看此图上的集群数量。但是我不知道怎么:)
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 图上显示集群的数量。有什么建议如何应对?非常感谢任何答案:)
答案位于此处:
特别是在这些行中:
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"]
您可以通过调用模型变量 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)
我想在得到som plot后了解我的wine连接到哪个节点。
这就是为什么我们首先需要 data.frame 得到葡萄酒的名称和葡萄酒所属的簇数。下一步是查看此图上的集群数量。但是我不知道怎么:)
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 图上显示集群的数量。有什么建议如何应对?非常感谢任何答案:)
答案位于此处:
特别是在这些行中:
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"]
您可以通过调用模型变量 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)