2016-06-09 4 views
0

Ich arbeite an einem k-Nearest Neighbours-Klassifizierungssystem und verwende ein "Bucket Voting" -System, das vorhergesagte Klassen abfragt und dann eine Vorhersage basierend auf der Klasse liefert höchste Anzahl von "Stimmen" innerhalb der Stichprobe.Markieren Sie nur die korrekte Klasse in einer anderen Farbe im R-Histogramm

Mein Problem ist, dass ich automatisch Histogramme erstellen möchte, die blaue Balken für die falschen Vorhersagen und einen roten Balken für die korrekt vorhergesagte Klasse haben. Hier ist ein Code-Schnipsel:

for (class in 14:15) { 
    class_test_index <- which(walkTest_labels == class) 
    class_test <- as.numeric(walkTest_pred[class_test_index]) 
    hist(class_test, 
      breaks = 0:22, 
      col = ifelse(class_test == class, "red", "blue"), 
      border = "green", 
      main = "Distribution by Classes", 
      ylab = "Count", 
      xlab = "Class") 
     } 

Ich habe gerade zwei der Klassen in meiner Schleife zur Veranschaulichung verwendet. Links zu den zwei Histogrammen, die sich ergeben, sind hier.

http://i.stack.imgur.com/VXger.png

http://i.stack.imgur.com/ChAE7.png

In beiden nur eine Bar, die größte, soll rot sein. In einem von ihnen ist der richtige Balken rot, aber es gibt einen anderen Balken, der ebenfalls rot ist. In dem anderen Histogramm gibt es wieder zwei Balken, die rot sind, aber beide sind falsch.

+0

Siehe [hier] (http://Stackoverflow.com/q/21858394/324364) für einige allgemeine Hinweise zu einem potenziell besseren Weg, 'hist' für diese Art von Dingen zu verwenden. Ein Balkendiagramm wäre jedoch wahrscheinlich einfacher und aufgrund der diskreten Natur Ihrer Daten sinnvoller. – joran

+0

Können Sie einige Reihen von Datenrahmen angeben, die Sie zum Erzeugen der Histogramme verwenden? – Nate

+0

Hallo Nathan, danke für die Nachfrage. Hier ist nur ein einfaches Beispiel, was verwendet wird, um das Histogramm zu erstellen. '> head (class_test) [1] 16 5 5 3 15 15 'Wie Sie sehen können, ist es nur ein Vektor von Klassifikationen. Sie bewegen sich zwischen 1 und 22. –

Antwort

0

Okay, ich habe eine Antwort auf meine Frage gefunden. Danke an Nathan Day, dass ich vorgeschlagen habe, die barplot() Funktion zu verwenden, denn so habe ich das Problem gelöst.

Ich habe einen Vektor erstellt, der alle meine Klassen enthielt (eine Liste von ganzen Zahlen von 1 bis 22). Dann habe ich innerhalb der for Schleife einen anderen Vektor erstellt, der durch Vergleichen jeder dieser Zahlen mit dem Klassenwert erzeugt wurde, der getestet wurde - wenn der Wert nicht übereinstimmt, erzeugt er einen Wert von "Blau" in dem Vektor, und wenn er es korrigiert erstellt "rot".

Wenn der Barplot erstellt wird, wird dieser Vektor als Farbparameter verwendet, wodurch Rot zur korrekten Klasse hinzugefügt und alle anderen Klassen blau eingefärbt werden. Voila!

Hier ist der Code:

class_list <- 1:22 

for (class in 14:15) { 
    class_test_index <- which(walkTest_labels == class) 
    class_test <- table(walkTest_pred[class_test_index]) 
    this_class <- ifelse(class_list == class, "red", "blue") 
    barplot(class_test, 
     col = this_class, 
     border = "green", 
     main = "Distribution by Classes", 
     ylab = "Count", 
     xlab = "Class") 
    } 

Wenn jemand eine elegantere Art und Weise denken kann, dies auszuführen, dass auch sehr geschätzt werden würde.

Verwandte Themen