2014-09-22 2 views
5

Я читал это сообщение в блоге на R-bloggers, и я смущен последним разделом кода и не могу понять это.Ошибка построения карт Кохонена в R?

http://www.r-bloggers.com/self-organising-maps-for-customer-segmentation-using-r/

я попытался воссоздать это с моими собственными данными. У меня есть 5 переменных, которые следуют за экспоненциальным распределением с 2755 точками.

Я хорошо с и можно построить карту, которую он генерирует:

plot(som_model, type="codes") 

enter image description here

В разделе кода я не понимаю, это:

var <- 1 
var_unscaled <- aggregate(as.numeric(training[,var]),by=list(som_model$unit.classif),FUN = mean, simplify=TRUE)[,2] 
plot(som_model, type = "property", property=var_unscaled, main = names(training)[var], palette.name=coolBlueHotRed) 

Как Я понимаю, этот раздел кода предполагает, что он будет отображать одну из переменных над картой, чтобы увидеть, как она выглядит, но в этом я столкнулся с проблемами. Когда я запускаю этот раздел кода я получаю предупреждение:

Warning message: 
In bgcolors[!is.na(showcolors)] <- bgcol[showcolors[!is.na(showcolors)]] : 
number of items to replace is not a multiple of replacement length 

и производит сюжет:

enter image description here

Который только некоторые, как выглядит не так ...

Теперь я думаю, что это дошло до того, как агрегированная функция переупорядочила данные. Длина var_unscaled равна 789, а длина данных som_model $, training [, var] и unit.classif - длина 2755. Я попытался построить агрегированные данные, результат не был предупреждением, но был непонятным графом (как и ожидалось).

Теперь я думаю, что это сделало это, потому что unit.classif имеет много повторяющихся чисел внутри него, и именно поэтому он уменьшился в размере.

Вопрос в том, беспокоиться ли я о предупреждении? Производит ли он точный график? Что именно представляет собой раздел «Свойство» в команде plot? Есть ли другой способ «Агрегатировать» данные?

+0

Если участок, если не правильно, то да, беспокоиться о предупреждении. В действительности, вы всегда должны быть обеспокоены тем, почему вы получаете предупреждение. Я не полностью проверил это, но заметил, что у вас есть подмножество в конце 'aggregate'. Это необходимо? –

+2

Вы должны предоставить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), чтобы мы могли запускать тот же код, что и вы, и получить такая же ошибка. В противном случае у нас действительно нет способа узнать, как ваши данные хранятся в каждом из этих объектов или как их следует комбинировать в заявлении сюжета. – MrFlick

+0

Откуда взялась палитра 'coolBlueHotRed', и какова ее длина? Он может быть настроен так, чтобы соответствовать данным примера, а не вашим данным. –

ответ

8

Я думаю, что вам нужно создать цвет палитры. Если поместить аргумент

coolBlueHotRed <- function(n, alpha = 1) {rainbow(n, end=4/6, alpha=alpha)[n:1]} 

, а затем попытаться получить участок, например

plot(som_model, type = "count", palette.name = coolBlueHotRed) 

конец является успешным.

Эта ссылка может помочь вам: http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=kohonen/man/plot.kohonen.Rd&d=R_CC

0

Я думаю, что не все клетки на вашей карте есть точки внутри. У вас есть карта 30 на 30 и около 2700 баллов. В среднем это около 3 баллов за ячейку. С большой вероятностью некоторые ячейки имеют более 3 баллов, а некоторые ячейки пустые.

Код в сообщении на R-bloggers хорошо работает, когда все ячейки имеют точки внутри.

Чтобы заставить его работать на данном попробуйте изменить эту часть:

var <- 1 
var_unscaled <- aggregate(as.numeric(training[, var]), by = list(som_model$unit.classif), FUN = mean, simplify = TRUE)[, 2] 
plot(som_model, type = "property", property = var_unscaled, main = names(training)[var], palette.name = coolBlueHotRed) 

с этим:

var <- 1 
var_unscaled <- aggregate(as.numeric(data.temp[, data.classes][, var]), 
          by = list(som_model$unit.classif), 
          FUN = mean, 
          simplify = T) 
v_u <- rep(0, max(var_unscaled$Group.1)) 
v_u[var_unscaled$Group.1] <- var_unscaled$x 
plot(som_model, 
    type = "property", 
    property = v_u, 
    main = colnames(data.temp[, data.classes])[var], 
    palette.name = coolBlueHotRed) 

Надеется, что это помогает.

0

Просто добавьте эти функции в скрипт:

coolBlueHotRed <- function(n, alpha = 1) {rainbow(n, end=4/6, alpha=alpha)[n:1]} 

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2") 
Смежные вопросы