2016-11-28 3 views
3

Ich möchte die Boundary-Decision-Funktion finden, um meine Daten zu klassifizieren. Hier ist ein Beispiel von ihnen.Grenzentscheidung mit knn-classifier

"Distance","Dihedral","Categ" 
    4.083,82.267,C 
    4.132,87.073,C 
    4.713,-80.999,C 
    3.427,-48.144,NC 
    3.663,96.994,C 
    3.99,71.919,C 
    3.484,78.684,C 

Bis jetzt habe ich das KNN-Modell, aber ich möchte die nichtlineare Entscheidungsgrenze plotten. In den Beispielen, die ich gesucht habe, gibt es einige Variablen, von denen ich keine Ahnung habe, wo ich sie verwenden soll oder was sie bedeuten. Ich spreche von diesem Beispiel, das ich in "The Elements of Statistical Learning" Buch

library(ElemStatLearn) 
require(class) 
x <- mixture.example$x 
g <- mixture.example$y 
xnew <- mixture.example$xnew 
mod15 <- knn(x, xnew, g, k=15, prob=TRUE) 
prob <- attr(mod15, "prob") 
prob <- ifelse(mod15=="1", prob, 1-prob) 
px1 <- mixture.example$px1 
px2 <- mixture.example$px2 
prob15 <- matrix(prob, length(px1), length(px2)) 
par(mar=rep(2,4)) 
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main= 
     "15-nearest neighbour", axes=FALSE) 
points(x, col=ifelse(g==1, "coral", "cornflowerblue")) 
gd <- expand.grid(x=px1, y=px2) 
points(gd, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue")) 
box() 

Was genau PX1 und PX2 ist gefunden? Brauche ich ähnliche Variablen für meinen speziellen Fall?

Vielen Dank für Ihre Hilfe!

+0

Ich denke, PX1 und PX2 sind einfach Vektor das Raster für die neuen Daten, das heißt, die Punkte entlang der x- und y-Achse beschreibt, in dem Sie neue Daten haben. – Andrie

Antwort

1

Ich habe das Beispiel überarbeitet und kommentiert, um klar zu machen, was passiert.

Das Beispiel erstellt einen Testsatz, der einfach ein erweitertes Grid ist, das den gesamten Testsatz umsetzt. Somit ist px1 ein Vektor, der die x-Komponente des Gitters der Testdaten beschreibt, und px2 ist ähnlich, aber für y. Dann ist xnew das Ergebnis .

Probieren Sie den folgenden Code, wo dies einigermaßen klar sein sollte. Ich habe auch den k-Wert geändert, und bot eine einfache Möglichkeit, xnew mit Intervallen Ihrer Wahl zu konstruieren.

library(ElemStatLearn) 
require(class) 

# Use the training data from mixture.example 
x <- mixture.example$x 
g <- mixture.example$y 

# Construct a test grid using the extent of the training data 
xx_range <- round(range(x[, 1]), 1) 
xy_range <- round(range(x[, 2]), 1) 

nnn <- 0.1 
px1 <- seq(xx_range[1], xx_range[2], by = nnn) # vector with x extent 
px2 <- seq(xy_range[1], xy_range[2], by = nnn) # vector with y extent 
xnew <- as.matrix(expand.grid(px1, px2))  # matrix of new values 

# Train a model 
k <- 10 
mod15 <- knn(x, xnew, g, k=k, prob=TRUE) 
prob <- attr(mod15, "prob") 
prob <- ifelse(mod15=="1", prob, 1-prob) 
prob15 <- matrix(prob, length(px1), length(px2)) 

# Plot the results 
par(mar=rep(2,4)) 
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main= 
      sprintf("%d-nearest neighbour", k), axes=FALSE) 
points(x, col=ifelse(g==1, "coral", "cornflowerblue")) 
points(xnew, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue")) 
box() 

enter image description here