Так, ви, звичайно, можете використовувати 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='')