K-lân cận với các biến nhị phân và liên tục


10

Tôi có một bộ dữ liệu với các cột a b c(3 thuộc tính). alà số và liên tục trong khi bcđược phân loại từng cấp độ với hai cấp độ. Tôi đang sử dụng phương pháp K-Recent Neighbor để phân loại abbật c. Vì vậy, để có thể đo khoảng cách tôi chuyển đổi tập dữ liệu của mình bằng cách xóa bvà thêm b.level1b.level2. Nếu quan sát icó cấp độ đầu tiên trong các bloại, b.level1[i]=1b.level2[i]=0.

Bây giờ tôi có thể đo khoảng cách trong tập dữ liệu mới của mình: a b.level1 b.level2

Từ quan điểm lý thuyết / toán học: Bạn có thể thực hiện hàng xóm gần nhất (KNN) với cả dữ liệu nhị phân và liên tục không?

Tôi đang sử dụng FNNgói trong R và chức năngknn()


Tôi không có kinh nghiệm KNN bên cạnh nhưng tôi không thấy biến nhị phân sẽ giúp ích nhiều như thế nào trong việc thiết lập khoảng cách. Tôi tò mò tại sao bạn nghiêng về phương pháp này.
rolando2

Bởi vì tôi không thấy một cách tốt hơn để so sánh một biến số với một biến phân loại. Vui lòng đề xuất một cách tiếp cận tốt hơn :)
k.dkhk

Câu trả lời:


11

Sẽ ổn khi kết hợp các biến phân loại và liên tục (tính năng).

Bằng cách nào đó, không có nhiều nền tảng lý thuyết cho một phương pháp như k-NN. Các heuristic là nếu hai điểm gần nhau (theo một khoảng cách nào đó), thì chúng có điểm chung về sản lượng. Có thể có có thể không. Và nó phụ thuộc vào khoảng cách bạn sử dụng.

Trong ví dụ của bạn, bạn xác định khoảng cách giữa hai điểm và chẳng hạn như:(a,b,c)(a,b,c)

  • lấy khoảng cách bình phương giữa và :aa(aa)2
  • Thêm +2 nếu và khác nhau, +0 nếu bằng (vì bạn tính chênh lệch 1 cho mỗi danh mục)bb
  • Thêm +2 nếu và khác nhau, +0 bằng nhau (giống nhau)cc

Điều này tương ứng với việc đưa ra trọng số ngầm cho từng tính năng.

Lưu ý rằng nếu lấy các giá trị lớn (như 1000, 2000 ...) với phương sai lớn thì trọng số của các tính năng nhị phân sẽ không đáng kể so với trọng số của . Chỉ có khoảng cách giữa và sẽ thực sự quan trọng. Và theo cách khác: nếu lấy các giá trị nhỏ như 0,001: chỉ các tính năng nhị phân sẽ được tính.aaaaa

Bạn có thể bình thường hóa hành vi bằng cách cân lại: chia từng tính năng cho độ lệch chuẩn của nó. Điều này áp dụng cả cho các biến liên tục và nhị phân. Bạn cũng có thể cung cấp trọng lượng ưa thích của riêng bạn.

Lưu ý rằng hàm R kNN () thực hiện điều đó cho bạn: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Là một nỗ lực đầu tiên, chỉ cần sử dụng về cơ bản Norm = true (chuẩn hóa). Điều này sẽ tránh hầu hết các ý nghĩa có thể xuất hiện khi kết hợp các tính năng liên tục và phân loại.


câu trả lời tốt (+1), tuy nhiên, bạn có thể đề cập nếu kích thước cao và có nhiều biến rời rạc, knn với khoảng cách Euclide có thể không hoạt động tốt.
Haitao Du

6

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:

Tách các biến nhị phân và giá trị thực

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:

Tách các biến nhị phân và 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='')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.