BiocNeighbors 1.2.0
的BiocNeighbors包实现了一些精确的最近邻搜索算法:
这两种方法在索引构建过程中都涉及到随机成分,尽管k最近邻结果是完全确定的1除非有领带,你看findKNN ?
获取详细信息。.
最明显的应用程序是执行k近邻搜索。我们在这里用一个点的超立方体模拟一个例子,为此我们想为每个点确定10个最近的邻居。
Nobs <- 10000 ndim <- 20 data <- matrix(runif(Nobs *ndim), ncol=ndim)
的findKNN ()
方法期望一个数字矩阵作为输入,数据点作为行,变量/维度作为列。我们通过设置表示我们想要使用KMKNN算法BNPARAM = KmknnParam ()
(这也是默认值,所以在这里不是严格必要的)。我们可以通过设置来使用VP树BNPARAM = VptreeParam ()
.
fout <- findKNN(data, k=10, BNPARAM=KmknnParam()) head(fout$index)
# #[1][2][3][4][5][6][7][8][9][10] # #[1] 6709 9627 8683 8907 4811 8728 9935 5093 1868 121 # #[2] 7593 9203 6652 961 2856 8711 4412 8907 4666 2811 # #[3] 8361 2534 7096 1443 8355 5135 730 9233 5057 3333 # #[4] 6116 9935 8994 4613 7533 7671 4938 587 9627 6673 # #[5] 4363 7309 3126 6247 4800 2470 1907 285 7956 3990 # #(6日)8871 5867 7618 1557 1016 7067 473 187 271 1517
头(输出端距离美元)
## [,1] [,2] [,3] [,4] [,5] [,5] [,5] [,5] [,5] [,5] [,5] 0.9134994 0.9279878 0.9321199 0.9432648 0.9759880 0.9883781 0.9904984 ## [2,] 0.8612897 0.9499456 0.9703708 0.9782614 1.0085772 1.0102099 ## [3,] 1.0378627 1.0478542 1.0709121 1.0858699 1.0869769 1.0923892 1.0965950 ## [4,] 0.9568614 1.0717803 1.0742441 1.0990840 1.1128575 1.1139495 1.1360398 ## [5,] 0.7955337 0.9129179 0.9275191 0.9435631 0.9749024 0.99312790.9980455 ## [,8] [,9] [,10] ## [1,] 0.9966502 1.0032015 1.0052059 ## [2,] 1.0129669 1.0177056 1.0362768 ## [3,] 1.1051209 1.1088504 1.1158236 ## [4,] 1.1429454 1.1429834 1.1538995 ## [5,] 0.9490294 0.9546187 0.9621188 ## [6,] 0.9994188 1.0027133 1.0101063
每一行指数
矩阵对应于数据
的行索引数据
它们是离它最近的邻居。例如,第3个点数据
有下列最近的邻居:
输出端美元指数[3]
## [1] 8361 2534 7096 1443 8355 5135 730 9233 5057 3333
…与这些邻居的距离如下:
输出端距离美元[3]
## [9] 1.108850 1.115824
注意,报告的邻居是按距离排序的。
另一个应用是根据另一个数据集中的查询点识别一个数据集中的k-最近邻居。同样,我们模拟了一个小数据集:
Nquery <- 1000 ndim <- 20 query <- matrix(runif(Nquery *ndim), ncol=ndim)
然后我们使用queryKNN ()
函数来识别中5个最近的邻居数据
对于中的每一点查询
.
qout <- queryKNN(data, query, k=5, BNPARAM=KmknnParam()) head(qout$index)
## [,1] [,2] [,3] [,4] [,5] ## [1,] 4271 6336 1896 66 5255 ## [2,] 577 2631 4942 8018 9216 ## [3,] 1282 7391 6915 9507 6113 ## [4,] 8115 5553 2903 1729 1585 ## [5,] 9979 5919 7712 1312 6032 ## [6,] 7124 1550 5867 4266 1743
头(qout距离美元)
## [,1] [,2] [,3] [,4] [,5] ## [1,] 0.8255378 0.9534278 0.9662206 0.9895064 0.9973368 ## [2,] 0.9082208 0.9134062 0.9218634 0.9518809 0.9672650 ## [3,] 0.9416898 0.9466910 0.9773505 0.9956400 0.9989399 ## [4,] 1.0114986 1.0219494 1.0297100 1.0405589 1.0559577 ## [5,] 0.8845057 0.8972909 0.8973070 0.9025898 0.9055773 ## [6,] 1.0793351 1.0811115 1.1228046 1.1345023 1.1360885
每一行指数
矩阵中包含行的下标数据
它们是一个点的最近邻居查询
.例如,第3个点查询
下列最近的邻居在吗数据
:
qout美元指数[3]
## [1] 1282 7391 6915 9507 6113
…与这些邻居的距离如下:
qout距离美元[3]
## [1] 0.9416898 0.9466910 0.9773505 0.9956400 0.9989399
同样,报告的邻居是按距离排序的。
方法对查询点的子集执行搜索子集=
论点。这将产生与搜索所有点并设置输出子集相同的结果,但比搜索所有点和设置输出子集更有效。
findKNN(data, k=5,子集=3:5)
## $index ## [,1] [,2] [,3] [,3] [,4] [,5] ## [,] 8361 2534 7096 1443 8355 ## [2,] 6116 9935 8994 4613 7533 ## [3,] 4363 7309 3126 6247 4800 ## ## $distance ## [,1] [,2] [,3] [,3] [,4] [,5] ## [1,] 1.0378627 1.047854 1.0709121 1.0858699 1.086977 ## [2,] 0.9568614 1.071780 1.0742441 1.0990840 1.112857 ## [3,] 0.8285719 0.837526 0.8930268 0.9053241 0.916920
如果只有感兴趣的索引,用户可以设置get.distance = FALSE
避免返回距离矩阵。这将节省一些时间和内存。
findKNN(data, k=2, get.distance=FALSE))
##[1]“index”
类的并行计算也很容易加快函数的速度BiocParallel框架。
library(BiocParallel) out <- findKNN(data, k=10, BPPARAM= multicorepam (3))
对于一个常量的多次查询数据
,预聚类可以在单独的步骤中使用buildIndex ()
.然后可以将结果传递给多个调用,避免重复集群的开销2时自动确定算法类型BNINDEX
是指定的,所以没有必要也指定吗BNPARAM
在后面的函数中。.
- buildIndex(data, BNPARAM=KmknnParam()) out1 <- findKNN(BNINDEX=pre, k=5) out2 <- queryKNN(BNINDEX=pre, query=query, k=2)
高级用户也可能对raw.index =
参数,该参数将索引直接返回给预先计算的对象,而不是返回给数据
.这可能在包函数中很有用,在那里处理公共预计算对象可能更方便。
sessionInfo ()
## R版本3.6.0(2019-04-26)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 18.04.2 LTS下## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.9-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.9-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_US。UTF-8 LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基础包:## [1]stats graphics grDevices utils datasets methods基础## ##其他附加包:## [1]BiocParallel_1.18.0 BiocNeighbors_1.2.0 knitr_1.22 ## [4] BiocStyle_2.12.0 ## ##通过命名空间加载(且未附加):## [4] stats4_3.6.0 magrittr_1.5 evaluate_0.13 ## [7] stringi_1.4.3 S4Vectors_0.22.0 rmarkdown_1.12 ## [10] tools_3.6.0 string_1 .4.0 parallel_3.6.0 ## [13] xfun_0.6 yaml_2.2.0 compiler_3.6.0 ## [16] BiocGenerics_0.30.0 BiocManager_1.30.4 htmltools_0.3.6
王欣。2012。使用k均值聚类和三角不等式的高维搜索的快速精确k近邻算法过程Int Jt Conf神经网络43(6): 2351 - 8。
扬尼洛斯,1993。一般度量空间中最近邻搜索的数据结构和算法在苏打水, 93:311-21。194.