我有以下代码使用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.dist
中的每个值设置为nn.dist * nn.index/1000
?
所以attr(k, "nn.dist")[1,1]
会从1385.398
转到1385.398*983/1000
(1361.846)
和
attr(k, "nn.dist")[1,2]
会从1687.901
转到1687.901*362/1000
(611.02)等。
我可以使用以下代码一次执行此操作:
attr(k, "nn.dist")[1,1] = attr(k, "nn.dist")[1,1]*attr(k, "nn.index")[1,1]/1000
但我需要一种方法对每个元素都这样做,而不是每次都写它......
答案 0 :(得分: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
的{{1}}属性,但我建议您复制以确保您知道它不是原始输出,例如
k
或者您只需在原始
中添加新属性即可k_adj <- k
attr(k_adj, "nn.dist") <- attr(k_adj, "nn.dist") * attr(k_adj, "nn.index") /1000