Sim, você certamente pode usar o KNN com dados binários e contínuos, mas há algumas considerações importantes das quais você deve estar ciente ao fazer isso.
Os resultados serão fortemente informados pelas divisões binárias relativas à dispersão entre os resultados com valor real (para 0-1 vetores dimensionados e não ponderados), conforme ilustrado abaixo:
Você pode ver neste exemplo que os vizinhos mais próximos de uma observação individual por distância seriam MUITO mais informados pela variável binária do que pela variável de valor real em escala.
Além disso, isso se estende a várias variáveis binárias - se alterarmos uma das variáveis com valor real para binário, podemos ver que as distâncias serão muito mais informadas pela correspondência em todas as variáveis binárias envolvidas do que na proximidade dos valores reais:
Você desejará incluir apenas variáveis binárias críticas - na verdade, você está perguntando "de todas as observações que correspondem a essa configuração de variáveis binárias (se houver), que têm os valores reais mais próximos?" Esta é uma formulação razoável de muitos problemas que poderiam ser tratados com o KNN e uma formulação muito pobre de outros 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='')