Sí, ciertamente puede usar KNN con datos binarios y continuos, pero hay algunas consideraciones importantes que debe tener en cuenta al hacerlo.
Los resultados van a estar fuertemente informados por las divisiones binarias en relación con la dispersión entre los resultados de valor real (para vectores escalados 0-1, no ponderados), como se ilustra a continuación:
Puede ver en este ejemplo que los vecinos más cercanos de una observación individual por distancia estarían MUCHO más informados por la variable binaria que por la variable de valor real escalada.
Además, esto se extiende a múltiples variables binarias: si cambiamos una de las variables de valor real a binario, podemos ver que las distancias serán mucho más informadas al coincidir en todas las variables binarias involucradas que en la cercanía de los valores reales:
Deberá incluir solo variables binarias críticas: en efecto, está preguntando "¿todas las observaciones que coinciden con esta configuración de variables binarias (si las hay), que tienen los valores reales más cercanos?" Esta es una formulación razonable de muchos problemas que podrían abordarse con KNN, y una formulación muy pobre de otros problemas.
#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='')