Карта SOM - R - пакет Кохонена - кластеризация

Я пробую карты SOM и кластеризацию в R. Я использую этот учебник: https://www.r-bloggers.com/self-organising-maps-for-customer-segmentation-using-r/ ... Карты SOM работают нормально, но когда я пытаюсь выполнить кластеризацию эта ошибка:

> mydata <- som_model$codes 
> wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var)) 
Error in apply(mydata, 2, var) : dim(X) must have a positive length.

Мой код:

 require(kohonen)
    data = matrix( 
    c(6, 6, 80, 280, 404, 0, 158, 158197, 158197233,
      6, 13, 85, 280, 402, 0, 160, 160197, 160197233,
      6, 13, 81, 283, 400, 0, 160, 160197, 160197233),    
     nrow=3,             
     ncol=9,              
     byrow = TRUE)    
    data_train <- data[, c(1,2,4,5,7,8,9)]
    data_train_matrix <- as.matrix(scale(data_train))
    som_grid <- somgrid(xdim = 2, ydim=1, topo="hexagonal")

    som_model <- som(data_train_matrix, 
      grid=som_grid, 
    rlen=500, 
     alpha=c(0.05,0.01), 
     keep.data = TRUE )



      #training proces
        plot(som_model, type="changes")
        #nodes 
        plot(som_model, type="count", main="Node Counts")
        #heatmap
        plot(som_model, type = "property", property = getCodes(som_model)[,4], main="Heat map - status")

mydata <- 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)

    ## use hierarchical clustering to cluster the codebook vectors
    som_cluster <- cutree(hclust(dist(som_model$codes)), 6)
    # plot these results:
    plot(som_model, type="mapping", bgcol = pretty_palette[som_cluster], main = "Clusters") 
    add.cluster.boundaries(som_model, som_cluster)

Он написан так же, как и учебник, так как же может работать учебник, а это нет? Я новичок в R, поэтому не понял этой ошибки. Я понял, что, наверное, проблема с матрицей, но как проблема?


person caroline    schedule 05.03.2018    source источник


Ответы (2)


Есть несколько проблем с вашим кодом. Прежде всего, вы начинаете с очень маленькой выборки данных, выполняете SOM на сетке 2 x 1, которая выводит всего 2 строки в som_model$codes, а затем выполняете kmeans с максимум 15 кластерами. Я предоставлю рабочий код с набором данных сонара из библиотеки mlbench. Я должен добавить, что никогда не использовал kohonen библиотеку или SOM в реальном анализе данных.

library(mlbench)
library(kohonen)
data(Sonar) #somewhat bigger data example

data_train <- Sonar[, 1:60] #use first 60 columns

data_train_matrix <- as.matrix(scale(data_train)) #scale data

som_grid <- somgrid(xdim = 5, ydim = 5, topo = "hexagonal") #initialize a bigger grid

som_model <- som(data_train_matrix, 
                 grid = som_grid, 
                 rlen = 500, 
                 alpha = c(0.05,0.01), 
                 keep.data = TRUE )

plot(som_model, type = "changes")

введите описание изображения здесь

mydata <- som_model$codes[[1]] #extract the matrix containing codebook vectors

wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var)) 

for (i in 2:24) { #i must be less than 5*5 the grid size defined at the begining
  wss[i] <- sum(kmeans(mydata, centers = i)$withinss)
}

plot(wss, type = "l")

введите описание изображения здесь

Давайте используем 8 кластеров, чтобы вырезать три:

som_cluster <- cutree(hclust(dist(mydata)), k = 8)

plot(som_model, type="mapping", bgcol = som_cluster, main = "Clusters") 
add.cluster.boundaries(som_model, som_cluster)

введите описание изображения здесь

person missuse    schedule 05.03.2018
comment
Спасибо. У меня есть примерная матрица небольшого размера, но на самом деле я использую матрицы многих размеров 3x3,5x5, 10x10. Это не помогло ни с чем из этого. Но правда, я не понимаю, насколько важно количество кластеров. - person caroline; 05.03.2018

Ошибка, которую вы получаете, - я считаю - потому что som_model$codes - это список, поэтому вы не можете использовать в нем apply, поэтому замените свое определение mydata на: mydata <- som_model$codes[[1]], например, просто добавьте [[1]] в конец

тогда это должно работать

person DS_UNI    schedule 05.03.2018