2012-08-28 11 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行に最も近い1000のトレーニングセット内のインデックスがありますテストセットの

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 weighted」というフレーズを検索するのと同じくらいの運があります。しかし、私は私の答えに重み付けについて少し書いています。 –

+0

わかりましたので、実際には 'k'の代わりに' results'を使っています。私はこれが違いをもたらさないと思うが、ただそれをそこに投げるべきだと思った。私は 'print(results)'を実行すると、最終的にcsvファイルに書き込まれる1000要素を出力します。 –

関連する問題