Sì, puoi sicuramente usare KNN con dati sia binari che continui, ma ci sono alcune considerazioni importanti di cui dovresti essere consapevole quando lo fai.
I risultati saranno pesantemente informati dalle divisioni binarie relative alla dispersione tra i risultati a valore reale (per vettori in scala 0-1 non ponderati), come illustrato di seguito:
Si può vedere in questo esempio che i vicini più vicini di una singola osservazione per distanza sarebbero MOLTO più fortemente informati dalla variabile binaria che dalla variabile di valore reale in scala.
Inoltre, questo si estende a più variabili binarie: se cambiamo una delle variabili con valore reale in binario, possiamo vedere che le distanze saranno molto più informate abbinando su tutte le variabili binarie coinvolte che in prossimità dei valori reali:
Ti consigliamo di includere solo le variabili binarie critiche. In effetti, ti stai chiedendo "di tutte le osservazioni che corrispondono a questa configurazione di variabili binarie (se presenti), che hanno i valori reali più vicini?" Questa è una formulazione ragionevole di molti problemi che potrebbero essere affrontati con KNN e una formulazione molto scarsa di altri problemi.
#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='')