2014-09-22 11 views
5

Czytałem ten post na blogu R-blogerów i jestem zdezorientowany ostatnią sekcją kodu i nie mogę tego rozgryźć.Błąd podczas tworzenia map Kohonena w R?

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

Mam próbował odtworzyć to z moich własnych danych. Mam 5 zmiennych, które następują po rozkładzie wykładniczym z 2755 punktów.

jestem w porządku i można wykreślić mapę że generuje:

plot(som_model, type="codes") 

enter image description here

Część kodu nie rozumiem jest:

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) 

Jak Rozumiem, ta sekcja kodu ma na celu wykreślić jedną ze zmiennych na mapie, aby zobaczyć, jak wygląda, ale w tym miejscu napotykam problemy. Gdy ten fragment kodu pojawia się ostrzeżenie:

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

i produkuje działki:

enter image description here

Które tylko niektóre jak nie wygląda dobrze ...

Teraz myślę, że sprowadza się do sposobu, w jaki funkcja agregująca ponownie zamówiła dane. Długość var_unscaled wynosi 789, a długość som_model $ data, training [, var] i unit.classif mają długość 2755. Próbowałem narysować zagregowane dane, wynik nie był ostrzeżeniem, ale niezrozumiałym wykresem (zgodnie z oczekiwaniami).

Teraz myślę, że tak się stało, ponieważ unit.classif zawiera wiele powtarzających się liczb i dlatego zmniejszył rozmiar.

Pytanie brzmi, czy martwię się ostrzeżeniem? Czy tworzy dokładny wykres? Czym dokładnie jest sekcja "Właściwość" w poleceniu fabuły? Czy istnieje inny sposób, w jaki mogę "agregować" dane?

+0

Jeżeli działka nie jest poprawna, jeśli to tak, martwić się ostrzeżenia. W rzeczywistości powinieneś zawsze zwracać uwagę na to, dlaczego otrzymujesz ostrzeżenie. Nie w pełni to sprawdziłem, ale zauważyłem, że masz podzbiór na końcu 'aggregate'. Czy to konieczne? –

+2

Powinieneś podać [przykład odtwarzalny] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), abyśmy mogli uruchomić ten sam kod co Ty i uzyskać ten sam błąd. W przeciwnym razie nie wiemy w jaki sposób dane są przechowywane w każdym z tych obiektów lub w jaki sposób powinny być połączone w deklaracji fabuły. – MrFlick

+0

Skąd pochodzi paleta 'coolBlueHotRed' i jaka jest jej długość? Może być skonfigurowany tak, aby pasował do danych przykładowych, a nie do danych. –

Odpowiedz

0

myślę, że nie wszystkie komórki mają na swojej mapie punkty wewnątrz. Masz 30 na 30 map i około 2700 punktów. Średnio wynosi około 3 punktów na komórkę. Z dużym prawdopodobieństwem niektóre komórki mają więcej niż 3 punkty, a niektóre komórki są puste.

Kod w poście na blogu R działa dobrze, gdy wszystkie komórki mają punkty w środku.

Aby pracować nad swoimi danymi próbować zmienić tę część:

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) 

z tego:

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) 

Nadzieję, że to pomaga.

0

Wystarczy dodać te funkcje do skryptu:

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

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2") 
Powiązane problemy