0

FNN Packageを使用する次のコードがあります。

k <- knn(train, test, labels, k = 10, algorithm="cover_tree")

以下のコードを使用して、knn の呼び出しによって返されたデータを確認できます。

> attr(k, "nn.dist")[1,]
 [1] 1385.398 1687.901 1722.884 1846.694 1978.250 1998.157 2003.518 2004.494 2054.382 2059.128
> attr(k, "nn.index")[1,]
 [1] 983 362 170 303 914 843 480 489 474 355

私がやりたいのは、 の値にnn.dist基づいて の値を変更することnn.indexです。

これはおそらく意味をなさないことはわかっていますが、議論のために、各値を に設定するにはどうすればよいでしょうnn.distnn.dist * nn.index/1000?

したがってattr(k, "nn.dist")[1,1]1385.398から1385.398*983/1000(1361.846)に移動します。

から (611.02) などにattr(k, "nn.dist")[1,2]移動します。1687.9011687.901*362/1000

次のコードを使用して、これを一度に 1 つずつ行うことができます。

attr(k, "nn.dist")[1,1] = attr(k, "nn.dist")[1,1]*attr(k, "nn.index")[1,1]/1000

しかし、毎回書くことなく、すべての要素に対してこれを行う方法が必要です...

4

1 に答える 1

1

基本的な演算子、、、*およびはベクトル化されており、配列に対して要素ごとに機能します。+/-

したがって、それは同じくらい簡単です

attr(k, "nn.dist") * attr(k, "nn.index") /1000

の最初の行に対してのみこれを実行する場合はnn.dist

attr(k, "nn.dist")[1,]* attr(k, "nn.index")[1,] /1000

nn.distの属性に再割り当てすることもできますがk、コピーして、元の出力ではないことを確認することをお勧めします。

k_adj <- k
attr(k_adj, "nn.dist") <- attr(k_adj, "nn.dist") * attr(k_adj, "nn.index") /1000

または、元の属性に新しい属性を追加するだけでもかまいません

 attr(k, 'nn.dist.adj') <- attr(k, "nn.dist") * attr(k, "nn.index") /1000
于 2012-08-28T23:17:50.447 に答える