2012-08-28 67 views
0

我已經用下面的代碼使用FNN Package如何修改R中knn返回的距離?

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 

我想do是根據nn.index中的值修改nn.dist中的值。

我知道這可能沒有意義,但爲了辯論的緣故,我該如何去設置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 

但我需要一種方法來做到這一點,每一個元素,而不必每次寫...

回答

1

基本操作符*,+,/-被矢量化並將在元素上工作。

因此,它是那麼容易,因爲

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

如果你只是想這樣做是爲了的nn.dist第一行,然後

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

你可以重新分配到的knn.dist屬性,但我建議複製以確保您知道它不是原始輸出,例如

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