2012-08-28 3 views
14

R, KNN 또는 데이터 과학 전반에 대한 경험이 없다고 말하는 것으로 시작하겠습니다. 나는 최근에 Kaggle을 찾았으며 Digit Recognition 경쟁/튜토리얼을 가지고 놀았습니다. R에서 가장 가까운 이웃을 보는 방법?

# makes the KNN submission 

library(FNN) 

train <- read.csv("c:/Development/data/digits/train.csv", header=TRUE) 
test <- read.csv("c:/Development/data/digits/test.csv", header=TRUE) 

labels <- train[,1] 
train <- train[,-1] 

results <- (0:9)[knn(train, test, labels, k = 10, algorithm="cover_tree")] 

write(results, file="knn_benchmark.csv", ncolumns=1) 

내 질문

은 다음과 같습니다 :

  1. 은 어떻게 선택되었습니다 가장 가까운 이웃을 볼 수 있습니다 그들은 당신이 기본적인 제출로 시작하는 일부 샘플 코드를 제공이 튜토리얼에서는

    a 특정 테스트 행?

  2. 선택한 10 개 중 어떤 것을 수정할 수 있습니까 results?

이러한 질문은 너무 광범위 할 수 있습니다. 그렇다면 올바른 길로 나를 안내 할 수있는 링크를 환영 할 것입니다.

내가 여기에 이해가되지 않는 뭔가를 말했을 가능성이 있습니다. 매우입니다. 이 경우, 저를 시정하십시오.

답변

23

1) 당신과 같이 주어진 행의 가장 가까운 이웃을 얻을 수 있습니다 :

k <- knn(train, test, labels, k = 10, algorithm="cover_tree") 
indices <- attr(k, "nn.index") 

을 그런 다음 트레이닝 세트 (20)를 행하기 위해 10 개 가까운 이웃의 인덱스를 원하는 경우 :

print(indices[20, ]) 

(k=10을 선택 했으므로 가장 가까운 이웃이 10 개 있습니다.) 예를 들어, 교육 및 테스트 세트의 첫 번째 1000 행으로 실행하는 경우 (이 계산 쉽게하기 위해) :

train <- read.csv("train.csv", header=TRUE)[1:1000, ] 
test <- read.csv("test.csv", header=TRUE)[1:1000, ] 

labels <- train[,1] 
train <- train[,-1] 

k <- knn(train, test, labels, k = 10, algorithm="cover_tree") 
indices = attr(k, "nn.index") 

print(indices[20, ]) 
# output: 
# [1] 829 539 784 487 293 882 367 268 201 277 

은 20 행에 가장 가까운 천의 트레이닝 세트 내의 인덱스입니다 시험 세트의

2) "수정"의 의미에 달려 있습니다. 우선, 당신은 다음과 같이 각 행에 10 개에 가장 가까운 라벨의 각각의 인덱스를 얻을 수 있습니다 :

closest.labels = apply(indices, 2, function(col) labels[col]) 

당신은 다음과 같이 20 훈련 지점 10 개에 가장 가까운 지점의 라벨을 볼 수

closest.labels[20, ] 
# [1] 0 0 0 0 0 0 0 0 0 0 

이는 행 20에 가장 가까운 모든 점 10 개가 모두 0으로 표시된 그룹에 있음을 나타냅니다. knn은 과반수 득표 (무작위로 겹쳐진 매듭)로 레이블을 선택하기 만하지만 어떤 종류의 가중치 체계를 선택할 수 있습니다. 너는 선호한다.

ETA는 : 감사합니다,

dists = attr(k, "nn.dist") 
dists[20, ] 
# output: 
# [1] 1238.777 1243.581 1323.538 1398.060 1503.371 1529.660 1538.128 1609.730 
# [9] 1630.910 1667.014 
+0

멋진 응답 : 당신이 당신의 투표 방식에 더 많이 더 가까운 요소를 가중치에 관심이 있다면, 당신은 또한이 같은 K 이웃의 각 거리를 얻을 수 있습니다 당신! 나는 몇 가지 질문을했다. 'indices'를 출력하려고 할 때마다 null을 돌려줍니다. 여러분의 예제와 다른 것을해야합니까? 사용자 지정 가중치 체계를 만드는 데 대해 더 많은 연구를 할 수있는 자원을 추천 할 수 있습니까? 또는 내가 볼 수있는 것을 만드는 누군가의 예입니까? –

+0

그건 아주 이상합니다.'print (k)'를하면 어떻게됩니까? 다른 가중치 적용 방식에 관해서는 Google에서 "KNN 가중치"구문을 검색 할 때 행운이 많을 것입니다. 그러나 나는 나의 대답에 무게를다는 것에 대해 조금 더 쓰고있다. –

+0

자, 이제 실제로는'k' 대신'results'를 사용하고 있습니다. 나는 이것이 차이를 만들지는 않겠지 만, 나는 그걸 밖으로 던져야한다고 생각했습니다. 내가'print (results)'할 때 결국 csv 파일에 쓰여지는 1000 개의 요소를 출력합니다. –

관련 문제