2014-09-22 21 views
5

Stavo leggendo questo post sul blog di R-blogger e sono confuso dall'ultima sezione del codice e non riesco a capirlo.Errore nel tracciare le mappe di Kohonen in R?

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

ho tentato di ricreare questo con i miei dati. Ho 5 variabili che seguono una distribuzione esponenziale con 2755 punti.

mi trovo benissimo con e possono tracciare la mappa che esso genera:

plot(som_model, type="codes") 

enter image description here

La sezione del codice che non capisco è il:

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) 

Come Lo capisco, questa sezione del codice suppone che stia tracciando una delle variabili sulla mappa per vedere come appare, ma è qui che mi imbatto in problemi. Quando eseguo questa sezione del codice ottengo l'avvertimento:

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

e produce la trama:

enter image description here

Il che in qualche modo non sembra giusto ...

Ora quello che penso sia venuto giù è il modo in cui la funzione di aggregazione ha riordinato i dati. La lunghezza di var_unscaled è 789 e la lunghezza di som_model $ data, training [, var] e unit.classif sono tutti di lunghezza 2755. Ho provato a tracciare i dati aggregati, il risultato non era un avvertimento ma un grafico incomprensibile (come previsto).

Ora penso che abbia fatto questo perché unit.classif ha molti numeri ripetuti al suo interno ed è per questo che ha ridotto le sue dimensioni.

La domanda è: sono preoccupato per l'avviso? Sta producendo un grafico preciso? Che cosa esattamente cerca la sezione "Proprietà" nel comando trama? C'è un modo diverso in cui posso "Aggregare" i dati?

+0

Se la trama, se non è corretta allora sì, si preoccupano per l'avvertimento. In realtà, dovresti sempre preoccuparti del motivo per cui ricevi un avvertimento. Non l'ho verificato completamente, ma ho notato che hai un sottoinsieme alla fine di "aggregare". È necessario? –

+2

Dovresti fornire un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) in modo che possiamo eseguire lo stesso codice di te e ottenere il stesso errore. Altrimenti non abbiamo davvero modo di sapere come i tuoi dati sono archiviati in ognuno di questi oggetti o come dovrebbero essere combinati nell'istruzione plot. – MrFlick

+0

Da dove proviene la palette 'coolBlueHotRed' e qual è la sua lunghezza? Potrebbe essere configurato per corrispondere ai dati di esempio, non ai tuoi dati. –

risposta

0

penso che non tutte le cellule sulla vostra mappa hanno punti all'interno. Hai 30 per 30 mappa e circa 2700 punti. In media è di circa 3 punti per cella. Con alta probabilità alcune celle hanno più di 3 punti e alcune celle sono vuote.

Il codice nel post su R-blogger funziona bene quando tutte le celle hanno punti all'interno.

Per farlo funzionare sui vostri dati provare modificare questa parte:

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) 

con questo:

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) 

Speranza che aiuta.

0

Basta aggiungere queste funzioni al vostro script:

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

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2") 
Problemi correlati