web-dev-qa-db-ja.com

Rで最も近い隣人を表示する方法は?

まず、R、KNN、またはデータサイエンス全般の経験がないということから始めましょう。私は最近 Kaggle を見つけ、 数字認識 競争/チュートリアルで遊んでいます。

このチュートリアルでは、基本的な提出を開始するためのサンプルコードをいくつか提供しています。

# 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. 特定のテスト行に対して選択された最近傍を表示するにはどうすればよいですか?
  2. resultsに選択されている10個のうちどれを変更するにはどうすればよいですか?

これらの質問は広すぎる可能性があります。もしそうなら、私は正しい道を私に向けることができるリンクを歓迎します。

ここで意味をなさないことを言った可能性は非常にあります。その場合は訂正してください。

15
Abe Miessler

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:投票スキームでより近い要素をより重く重み付けすることに関心がある場合は、次のようにk近傍のそれぞれまでの距離を取得することもできることに注意してください。

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
23
David Robinson