Oui, vous pouvez certainement utiliser KNN avec des données binaires et continues, mais vous devez être conscient de certaines considérations importantes lorsque vous le faites.
Les résultats vont être fortement informés par les divisions binaires relatives à la dispersion entre les résultats à valeur réelle (pour les vecteurs non pondérés à l'échelle 0-1), comme illustré ci-dessous:
Vous pouvez voir dans cet exemple que les voisins les plus proches d'une observation individuelle par la distance seraient BEAUCOUP plus informés par la variable binaire que par la variable de valeur réelle mise à l'échelle.
De plus, cela s'étend à plusieurs variables binaires - si nous changeons l'une des variables à valeur réelle en binaire, nous pouvons voir que les distances seront beaucoup plus informées en faisant correspondre toutes les variables binaires impliquées que dans la proximité des valeurs réelles:
Vous voudrez n'inclure que les variables binaires critiques - vous demandez en fait "à toutes les observations qui correspondent à cette configuration de variables binaires (le cas échéant), qui ont les valeurs réelles les plus proches?" Il s'agit d'une formulation raisonnable de nombreux problèmes qui pourraient être traités avec KNN, et d'une formulation très médiocre d'autres problèmes.
#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='')