Да, вы, безусловно, можете использовать KNN как с двоичными, так и с непрерывными данными, но при этом следует учитывать ряд важных соображений.
Результаты будут в значительной степени проинформированы бинарными расщеплениями относительно дисперсии среди реальных значений (для масштабированных 0-1 невзвешенных векторов), как показано ниже:
В этом примере вы можете видеть, что ближайшие соседи отдельного наблюдения по расстоянию будут НАМНОГО более сильно информированы двоичной переменной, чем масштабированной переменной действительного значения.
Кроме того, это распространяется на несколько двоичных переменных - если мы заменим одну из вещественных переменных на двоичную, мы увидим, что расстояния будут гораздо более информированными при сопоставлении по всем задействованным двоичным переменным, чем при приближении к действительным значениям:
Вы захотите включить только критические двоичные переменные - фактически вы спрашиваете «обо всех наблюдениях, которые соответствуют этой конфигурации двоичных переменных (если таковые имеются), которые имеют ближайшие реальные значения?» Это разумная формулировка многих проблем, которые можно решить с помощью KNN, и очень плохая формулировка других проблем.
#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='')