主にカテゴリの特徴を持つデータの分類を実行しようとしています。その目的のために、ユークリッド距離(または距離を想定した他の数値)は適合しません。
ハミング距離など、さまざまな距離法を選択できる[R]のkNN実装を探しています。{class}のような一般的なkNN実装を、さまざまな距離計量関数で使用する方法はありますか?
R2.15を使用しています
距離/非類似度行列を(好きな方法で)計算できる限り、特別なパッケージを必要とせずにkNN分類を簡単に実行できます。
# Generate dummy data
y <- rep(1:2, each=50) # True class memberships
x <- y %*% t(rep(1, 20)) + rnorm(100*20) < 1.5 # Dataset with 20 variables
design.set <- sample(length(y), 50)
test.set <- setdiff(1:100, design.set)
# Calculate distance and nearest neighbors
library(e1071)
d <- hamming.distance(x)
NN <- apply(d[test.set, design.set], 1, order)
# Predict class membership of the test set
k <- 5
pred <- apply(NN[, 1:k, drop=FALSE], 1, function(nn){
tab <- table(y[design.set][nn])
as.integer(names(tab)[which.max(tab)]) # This is a pretty dirty line
}
# Inspect the results
table(pred, y[test.set])
上記の汚い線よりも、ベクトルで最も一般的な値を見つけるためのより良い方法を誰かが知っているなら、私は喜んで知っているでしょう。
のdrop=FALSE
サブセットをNN
caseの行列として保持するには、引数が必要ですk=1
。そうでない場合は、ベクトルに変換されapply
、エラーがスローされます。