Có, bạn chắc chắn có thể sử dụng KNN với cả dữ liệu nhị phân và dữ liệu liên tục, nhưng có một số cân nhắc quan trọng bạn cần lưu ý khi làm như vậy.
Các kết quả sẽ được thông báo rất nhiều bởi các phân chia nhị phân liên quan đến sự phân tán giữa các kết quả có giá trị thực (đối với các vectơ không có tỷ lệ 0-1), như minh họa dưới đây:
Trong ví dụ này, bạn có thể thấy rằng hàng xóm gần nhất của một quan sát riêng lẻ sẽ được NHIỀU thông tin nhiều hơn bởi biến nhị phân so với biến giá trị thực được chia tỷ lệ.
Hơn nữa, điều này mở rộng ra nhiều biến nhị phân - nếu chúng ta thay đổi một trong các biến có giá trị thực thành nhị phân, chúng ta có thể thấy rằng khoảng cách sẽ được thông báo nhiều hơn bằng cách khớp trên tất cả các biến nhị phân có liên quan so với gần các giá trị thực:
Bạn sẽ chỉ muốn bao gồm các biến nhị phân quan trọng - thực tế, bạn đang hỏi "tất cả các quan sát khớp với cấu hình của các biến nhị phân này (nếu có), có các giá trị thực gần nhất?" Đây là một công thức hợp lý của nhiều vấn đề có thể được giải quyết với KNN, và một công thức rất kém của các vấn đề khác.
#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='')