2014-09-22 12 views
5

Ich habe diesen Blogbeitrag über R-Blogger gelesen und bin verwirrt über den letzten Abschnitt des Codes und kann es nicht herausfinden.Fehler beim Plotten von Kohonen-Karten in R?

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

Ich habe versucht, dies mit meinen eigenen Daten neu zu erstellen. Ich habe 5 Variablen, die einer Exponentialverteilung mit 2755 Punkten folgen.

Ich bin mit Fein- und können die Karte plotten, die es erzeugt:

plot(som_model, type="codes") 

enter image description here

Der Abschnitt des Codes Ich verstehe nicht, das ist:

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) 

Wie Ich verstehe es, dieser Teil des Codes soll eine der Variablen über die Karte zeichnen, um zu sehen, wie sie aussieht, aber hier stoße ich auf Probleme. Als ich diesen Abschnitt des Code ausführen bekomme ich die Warnung:

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

und produziert sie die Handlung:

enter image description here

die nur einige, wie nicht gut aussieht ...

Nun, was ich denke, es ist auf die Art und Weise gekommen, wie die Aggregatfunktion die Daten neu geordnet hat. Die Länge von var_unscaled ist 789 und die Länge von som_model $ data, training [, var] und unit.classif sind alle der Länge 2755. Ich habe versucht, die aggregierten Daten zu plotten, das Ergebnis war keine Warnung, sondern ein unverständliches Diagramm (wie erwartet).

Jetzt denke ich, dass es das getan hat, weil unit.classif viele wiederholte Zahlen darin hat und deshalb hat es in der Größe reduziert.

Die Frage ist, mache ich mir Sorgen wegen der Warnung? Produziert es eine genaue Grafik? Was genau sucht der Abschnitt "Property" im Befehl plot? Gibt es eine andere Möglichkeit, die Daten zu "aggregieren"?

+0

Wenn die Handlung, wenn nicht korrekt, dann ja, über die Warnung zu kümmern. In Wirklichkeit sollten Sie immer daran interessiert sein, warum Sie eine Warnung erhalten. Ich habe es nicht vollständig überprüft, aber ich habe bemerkt, dass Sie eine Untergruppe am Ende von "Aggregat" haben. Ist das notwendig? –

+2

Sie sollten ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) zur Verfügung stellen, damit wir den gleichen Code wie Sie ausführen können und die gleicher Fehler Ansonsten können wir wirklich nicht wissen, wie Ihre Daten in jedem dieser Objekte gespeichert sind oder wie sie in der Plot-Anweisung kombiniert werden sollen. – MrFlick

+0

Woher kommt die Palette 'coolBlueHotRed' und welche Länge hat sie? Es ist möglicherweise so konfiguriert, dass es den Beispieldaten und nicht Ihren Daten entspricht. –

Antwort

8

Ich denke, dass Sie die Palettenfarbe erstellen müssen. Wenn Sie das Argument setzen

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

und dann versuchen, ein Grundstück zu bekommen, zum Beispiel

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

das Ende ist erfolgreich.

können Sie diesen Link helfen: http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=kohonen/man/plot.kohonen.Rd&d=R_CC

0

Ich denke, dass auf der Karte Punkte innerhalb nicht alle Zellen. Sie haben 30 von 30 Karte und etwa 2700 Punkte. Im Durchschnitt sind es ungefähr 3 Punkte pro Zelle. Mit hoher Wahrscheinlichkeit haben einige Zellen mehr als 3 Punkte und einige Zellen sind leer.

Der Code in der Post auf R-Bloggern funktioniert gut, wenn alle Zellen Punkte enthalten.

Um es auf Ihre Daten funktioniert versuchen, diesen Teil ändern:

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) 

mit dieser:

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) 

Hoffe, es hilft.

0

einfach diese Funktionen zu Ihrem Skript hinzufügen:

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

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