열 a b c
(3 속성) 이있는 데이터 세트가 있습니다 . a
반면 숫자와 연속 b
과 c
두 가지 수준의 각 범주입니다. K-Nearest Neighbors 방법을 사용하여 분류 a
하고 b
있습니다 c
. 따라서 거리를 측정 할 수 있으려면 및를 b
추가 b.level1
하고 추가하여 데이터 세트를 변환하십시오 b.level2
. 관측치 i
에 b
범주 의 첫 번째 수준이있는 경우 b.level1[i]=1
및 b.level2[i]=0
.
이제 새 데이터 세트에서 거리를 측정 할 수 있습니다. a b.level1 b.level2
이론적 / 수학적 관점에서 : 이진 데이터와 연속 데이터를 모두 사용하여 K- 최근 접 이웃 (KNN)을 수행 할 수 있습니까?
FNN
R에서 패키지를 사용 하고 있습니다.knn()
답변
범주 형 변수와 연속 변수 (기능)를 결합해도됩니다.
k-NN과 같은 방법에 대한 이론적 근거는 그리 많지 않습니다. 휴리스틱은 두 지점이 서로에 가깝다면 (일부 거리에 따라) 출력 측면에서 공통점이 있다는 것입니다. 아마 그렇습니다, 아마 그렇습니다. 그리고 그것은 당신이 사용하는 거리에 달려 있습니다.
귀하의 예에서는 두 점 사이의 거리를 정의합니다
과
같은 :
- 사이의 제곱 거리를
과 : - 경우 +2 추가
과 같으면 +0이 다릅니다 (각 카테고리마다 1의 차이를 계산하기 때문에) - 경우 +2 추가
과 다르며 +0은 같습니다 (동일 함)
이는 각 기능에 암시 적으로 가중치를 부여하는 것에 해당합니다.
만약에
큰 분산으로 큰 값 (1000, 2000 등)을 취하면 이진 피처의 가중치는 가중치와 비교할 때 무시할 수 있습니다
. 사이의 거리 만
과
정말 중요합니다. 그리고 다른 방법 : if
0.001과 같은 작은 값을 취합니다. 이진 기능 만 계산됩니다.
각 기능을 표준 편차로 나누면 무게를 다시 측정하여 동작을 정규화 할 수 있습니다. 이는 연속 변수와 이진 변수에 모두 적용됩니다. 자신이 선호하는 가중치를 제공 할 수도 있습니다.
R 함수 kNN ()은 당신을 위해 그것을합니다 : https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN
첫 번째 시도로 기본적으로 norm = true (정규화)를 사용하십시오. 이렇게하면 연속 및 범주 기능을 결합 할 때 나타날 수있는 대부분의 말이되지 않습니다.
답변
그렇습니다. 바이너리 및 연속 데이터와 함께 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='')