Как получить количество кластеров на графике 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])

И теперь я хочу, чтобы номера кластеров были показаны там, на графике сома. Есть предложения, как с этим справиться? Был бы признателен за любой ответ :)


person Maksym Moroz    schedule 30.01.2019    source источник
comment
Я не уверен, что вы спрашиваете. Вы просто хотите написать текст Три кластера на графике? Или вы имеете в виду что-то другое?   -  person G5W    schedule 31.01.2019
comment
нет, я хочу знать координаты каждого вина. Чтобы быть более ясным, у нас есть карта 5 * 5 и 163 идентификатора вина, и я хочу знать, к какому узлу принадлежит это вино. Я имею в виду, что некоторые из них будут лежать в узле [1,2], некоторые в [3,4] (если первое число — ось x, а второе — ось y), и эти вина принадлежат разным кластерам, и я хочу увидеть, где конкретно расположено каждое вино (не только узнать номер кластера, к которому они принадлежат, но и их координаты на карте), чтобы визуально понять, какое у них поведение.   -  person Maksym Moroz    schedule 31.01.2019


Ответы (2)


Вы можете проверить, к какому узлу принадлежит каждое наблюдение, вызвав переменную модели, а именно unit.classif. На основе ваших скриптов вы назначаете модель som_model. Поэтому вы можете позвонить

som_model$unit.classif

Вектор упорядочен по порядку строк ваших данных, т. е. ваши 1-е входные данные принадлежат узлу, обозначенному 1-м значением вектора 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)
person h45    schedule 19.02.2019

ответ находится здесь: добавить кластеры и узлы из 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"]
person Maksym Moroz    schedule 31.01.2019