Tak, z pewnością możesz używać KNN zarówno z danymi binarnymi, jak i ciągłymi, ale należy pamiętać o kilku ważnych kwestiach.
Wyniki będą silnie informowane przez podziały binarne w odniesieniu do dyspersji wyników o wartościach rzeczywistych (dla wektorów skalowanych 0-1, nieważonych), jak pokazano poniżej:
W tym przykładzie widać, że najbliżsi sąsiedzi z poszczególnych obserwacji pod względem odległości byliby O DUŻO silniej poinformowani przez zmienną binarną niż przez skalowaną zmienną wartości rzeczywistej.
Co więcej, rozciąga się to na wiele zmiennych binarnych - jeśli zmienimy jedną ze zmiennych o wartościach rzeczywistych na binarne, możemy zauważyć, że odległości będą znacznie bardziej świadome poprzez dopasowanie wszystkich zmiennych binarnych, niż w bliskości rzeczywistych wartości:
Będziesz chciał uwzględnić tylko krytyczne zmienne binarne - w rzeczywistości pytasz „o wszystkie obserwacje, które pasują do tej konfiguracji zmiennych binarnych (jeśli istnieją), które mają najbliższe wartości rzeczywiste?” Jest to rozsądne sformułowanie wielu problemów, które można rozwiązać za pomocą KNN, i bardzo słabe sformułowanie innych problemów.
#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='')