Ja, Sie können KNN sicherlich sowohl mit binären als auch mit kontinuierlichen Daten verwenden, aber es gibt einige wichtige Überlegungen, die Sie dabei berücksichtigen sollten.
Die Ergebnisse werden stark von den binären Teilungen in Bezug auf die Streuung unter den reellen Ergebnissen (für 0-1 skalierte, ungewichtete Vektoren) beeinflusst, wie unten dargestellt:
Sie können in diesem Beispiel sehen, dass die nächsten Nachbarn einer einzelnen Beobachtung nach Entfernung VIEL stärker von der binären Variablen als von der skalierten Realwertvariablen beeinflusst werden.
Darüber hinaus erstreckt sich dies auf mehrere binäre Variablen. Wenn wir eine der reellen Variablen in binäre Variablen ändern, können wir sehen, dass die Abstände durch Abgleich aller beteiligten binären Variablen viel besser informiert werden als in der Nähe der reellen Werte:
Sie möchten nur kritische binäre Variablen einschließen - Sie fragen tatsächlich "nach allen Beobachtungen, die mit dieser Konfiguration von binären Variablen (falls vorhanden) übereinstimmen, die die nächsten reellen Werte haben?" Dies ist eine vernünftige Formulierung vieler Probleme, die mit KNN angegangen werden könnten, und eine sehr schlechte Formulierung anderer Probleme.
#code to reproduce plots:
library(scatterplot3d)
scalevector <- function(x){(x-min(x))/(max(x)-min(x))}
x <- scalevector(rnorm(100))
y <- scalevector(rnorm(100))
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))
scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
type="h", angle =235, xlab='', ylab='', zlab='')
x <- scalevector(rnorm(100))
y <- ifelse(sign(rnorm(100))==-1, 0, 1)
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))
scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
type="h", angle =235, xlab='', ylab='', zlab='')