如何修改R中knn返回的距离?

时间:2012-08-28 23:05:55

标签: r

我有以下代码使用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

但我需要一种方法对每个元素都这样做,而不是每次都写它......

1 个答案:

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