15

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. これらの 10 個のうちどれが自分の に選択されているかを変更するにはどうすればよいresultsですか?

これらの質問は広すぎるかもしれません。もしそうなら、正しい道を示すことができるリンクを歓迎します.

ここで意味をなさないことを言った可能性が非常に高いです。これが事実である場合、私を修正してください。

4

1 に答える 1

23

1)次のように、特定の行の最近傍を取得できます。

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

次に、トレーニング セットの行 20 に 10 個の最近傍のインデックスが必要な場合:

print(indices[20, ])

( を選択したため、10 個の最近傍が取得されますk=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
于 2012-08-28T06:03:41.197 に答える