Как получить номер кластера на участке SOM, в каждом узле?
Я хочу понять, с каким узлом связано мое вино после получения сома.
Вот почему в первую очередь нам нужно получить 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])
А теперь я хочу, чтобы на кластере сомов было показано число кластеров. Есть ли предложения, как с этим справиться? Буду признателен за любой ответ:)
2 ответа
Ответ находится здесь: добавьте кластеры и узлы из пакета SOMbrero к обучающим данным
Особенно в этих строках:
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
Вектор упорядочен в соответствии с порядком строк ваших данных, т.е. ваши первые входные данные принадлежат узлу, обозначенному значением вектора 1st unit.classif, и так далее. Вы можете проверить, позвонив
length(som_model$unit.classif)
nrow(som_wines)
Они имеют одинаковую длину. Библиотека упорядочивает узлы в матрице, чье количество измерений (узлов х функций). Если вы определили, что ваша модель имеет 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)