2017-10-30 12 views
0

dprepパッケージでknngowを使いたいです。また、テストデータの適切なラベルを返すだけでなく、列インデックスを列データの最も近い隣に戻したいと考えています。このパッケージには、このジョブのための関数はありますか?私のデータは以下の通りです。knngowの最近隣のインデックスを返す方法

df1<-data.frame(c("a","b","c"),c(1,2,3),c("T","F","T")) 
df2<-data.frame(c("a","d","f"),c(4,1,3),c("F","F","T")) 
mylist1<-list() 
mylist1[[1]]<-df1 
mylist1[[2]]<-df2 
tst1<-data.frame(c("f"),c(2)) 
library(dprep) 
for(i in 1:length(mylist1)){ 
    knn_model<-knngow(mylist1[[i]],tst1,1)} 

私はたとえば、ラベルを返すことに加えて、最近傍をマイリストに3行目にあることを示し、たい[[2]]

+0

は私を助けてください。この質問への回答が必要です – maria

答えて

0

あなたのコメントに基づいて更新

dprepパッケージに関する列車データに最も近い隣人のインデックスを返す関数はありません(うまくいけば私は何かを見逃しません)。 しかし、あなたは最初に距離行列(FDパッケージ)を使って距離行列を計算し、次にこの行列をk-nearest-neighbors関数に渡します(KernelKnnパッケージは距離行列を入力として受け入れます)。 KernelKnnパッケージを使用する場合は、最初にdevtools :: install_github( 'mlampros/KernelKnn')を使用して最新バージョンをインストールしてください。

# train-data [ "col3" is the response variable, 'stringsAsFactors' by default ] 
df1 <- data.frame(col1 = c("a","d","f"), col2 = c(1,3,2), col3 = c("T","F","T"), stringsAsFactors = T)       

# test-data 
tst1 <- data.frame(col1 = c("f"), col2 = c(2), stringsAsFactors = T)          

# rbind train and test data (remove the response variable from df1) 
df_all = rbind(df1[, -3], tst1)               

# calculate distance matrix 
dist_gower = as.matrix(FD::gowdis(df_all)) 

# use the dist_gower distance matrix as input to the 'distMat.knn.index.dist' function 
# additionaly specify which row-index is the test-data observation from the previously 'df_all' data.frame using the 'TEST_indices' parameter 
idxs = KernelKnn::distMat.knn.index.dist(dist_gower, TEST_indices = c(4), k = 2, threads = 1, minimize = T) 

idxs $ test_knn_idxあなたはまた、クラスラベルの確率をしたい場合は、最初に変換列データのテストデータ観測のk最近傍に

print(idxs) 

$test_knn_idx 
    [,1] [,2] 
[1,] 3 1 

$test_knn_dist 
    [,1] [,2] 
[1,] 0 0.75 

を返します。あなたは、また

y_numeric = as.numeric(df1$col3) 

labels = KernelKnn::distMat.KernelKnn(dist_gower, TEST_indices = c(4), y = y_numeric, k = 2, regression = F, threads = 1, Levels = sort(unique(y_numeric)), minimize = T) 

print(labels) 

    class_1 class_2 
[1,]  0  1 

# class_2 corresponds to "T" from col3 (df1 data.frame) 

distMat.KernelKnn機能を使用し、その後、数値とdprepに見てみることができ:: knngow、特に興味のあるものを実際に関数の第二部、

> print(dprep::knngow) 

.... 
    else { 
     for (i in 1:ntest) { 

      tempo = order(StatMatch::gower.dist(test[i, -p], train[, -p]))[1:k] 

      classes[i] = moda(train[tempo, p])[1] 
     } 
    } 
..... 
+0

ありがとうございました。しかし、gowdis関数では、データフレーム内のサンプル間の距離を計算します。そして、この関数の行列をdistMat.knn.index.distに渡すと、各インスタンスについて、インデックスは同じデータフレーム内で最も近いネイバーを与えます。しかし、私のテストサンプルは別のデータフレームにあり、列車データは別のデータフレームにあります。だから、私は電車のデータにテストインスタンスのための最も近い隣人のインデックスが必要です。あなたはこれについて何か提案がありますか? あなたの助けをありがとう – maria

+0

@maria、私は答えを更新しました。 – lampros

関連する問題