0

我有以下代码使用FNN 包

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.3981385.398*983/1000(1361.846)

并且 attr(k, "nn.dist")[1,2]会从1687.9011687.901*362/1000(611.02)等。

我可以使用以下代码一次执行此操作:

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 回答