1介绍

BiocNeighbors包实现一些算法的最近邻搜索:

  • 再邻居(KMKNN)的k - means算法王(2012)使用k - means聚类来创建一个索引。在每个集群,每个集群的点的距离计算集群中心和用于排序所有点。给定一个查询点,每个集群中心的距离是决定和三角不等式应用于确定哪些点在每个集群保证一个完整的距离计算。
  • 优势(VP)树算法(Yianilos 1993)包括构建树,每个节点位于一个数据点和相邻点的子集。每个节点逐步分区点分为两个子集,接近或进一步比给定阈值的节点。给定一个查询点,应用三角不等式在树中的每个节点来确定子节点搜索。

两种方法包括随机性在索引结构的一个组成部分,尽管再邻居结果是完全确定的1除了关系的存在,看到的findKNN ?获取详细信息。

2确定再邻居

最明显的应用程序执行一个再邻居搜索。我们模拟了一个例子超立方体的点,我们想确定10为每个点最近的邻居。

脑袋< - 10000 ndim < < - - 20数据矩阵(runif(脑袋* ndim), ncol = ndim)

findKNN ()方法接受一个数字矩阵作为输入数据点为行和变量/维度列。我们表明,我们想使用KMKNN算法通过设置BNPARAM = KmknnParam ()(这也是默认值,所以这并不是必需的)。我们可以使用一个副总裁树而不是通过设置BNPARAM = VptreeParam ()

输出端< - findKNN(数据、k = 10 BNPARAM = KmknnParam())头(输出端美元指数)
# #[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][6][7]# #(1)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.0099281 - 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.8285719 0.8375260 0.8930268 0.9053241 0.9169200 0.9226835 0.9358931 # #[6]0.7955337 0.9129179 0.9275191 0.9435631 0.9749024 0.9931279 - 0.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 1.1429454 1.1429834 1.1538995(4)# #(5)0.9490294 0.9546187 0.9621188 # #(6日)0.9994188 1.0027133 1.0101063

的每一行指数矩阵对应于一个点数据包含行索引数据最近的邻国。例如,第三点数据最近的邻居有以下:

输出端美元指数[3]
# # [1]8361 2534 7096 1443 8355 5135 730 9233 5057 3333

与以下距离这些邻居:…

输出端距离美元[3]
# # [1]1.037863 1.047854 1.070912 1.085870 1.086977 - 1.092389 1.096595 - 1.105121 1.108850 - 1.115824 # # [9]

注意,邻居们按距离排序。

3查询再邻居

再另一个应用程序是确定邻居在一个数据集是基于查询点另一个数据集。再一次,我们模拟了一个小数据集:

nquery ndim < < - 1000 - 20查询< -矩阵(runif (nquery * ndim), ncol = ndim)

然后,我们使用queryKNN ()函数来识别5最近的邻居数据每一个点的查询

qout < - queryKNN(数据、查询、k = 5, BNPARAM = KmknnParam())头(qout美元指数)
# # [1][2][3][4][5]# # [1]4271 6336 1896 66 5255 # # (2)577 2631 4942 8018 9216 # # 1282 7391 6915 9507 6113 (3)# # [4]8115 5553 2903 1729 1585 # # (5)9979 5919 7712 1312 6032 # # 7124 1550 5867 4266 1743 (6)
头(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

的每一行指数矩阵包含行索引数据这是最近的邻居的一个点查询。例如,第三点查询最近的邻居有以下数据:

qout美元指数[3]
# # 1282 7391 6915 9507 6113 [1]

与以下距离这些邻居:…

qout距离美元[3]
# # [1]0.9416898 0.9466910 0.9773505 0.9956400 0.9989399

再一次,邻居们按距离排序。

4进一步的选择

用户可以执行搜索查询点使用的一个子集子集=论点。这个收益率相同的结果,但是比执行更有效的搜索所有点和构造子集输出。

findKNN (k = 5,数据子集= 3:5)
# # # #美元指数[1][2][3][4][5]# #[1]8361 2534 7096 1443 8355 # #(2)6116 9935 8994 4613 7533 # #[3]4363 7309 3126 6247 # # # # # # 4800距离[1][2][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(数据、k = 2 get.distance = FALSE))
# #[1]“指数”

也简单的加速功能通过并行计算BiocParallel框架。

图书馆(BiocParallel) < - findKNN(数据、k = 10 BPPARAM = MulticoreParam (3))

多个查询一个常数数据,pre-clustering可以执行在一个单独的步骤buildIndex ()。结果可以被传递给多个调用,避免重复集群的开销2时自动确定算法类型BNINDEX是指定的,所以也没有必要指定吗BNPARAM在以后的功能。

前< - buildIndex(数据,BNPARAM = KmknnParam())着干活< - findKNN (BNINDEX =前,k = 5) out2 < - queryKNN (BNINDEX =前,查询=查询,k = 2)

高级用户可能感兴趣的raw.index =参数,直接返回指数而不是预先计算的对象数据。这可能是有用的内部包功能可能更方便工作的地方在一个共同的预先计算的对象。

5会话信息

sessionInfo ()
# # R版本3.6.0(2019-04-26)# #平台:x86_64-pc-linux-gnu(64位)# #下运行:Ubuntu 18.04.2 LTS # # # #矩阵产品:默认# #布拉斯特区:/home/biocbuild/bbs - 3.9 - bioc / R / lib / libRblas。所以# # LAPACK: /home/biocbuild/bbs - 3.9 - bioc / R / lib / libRlapack。# # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C # #[3]而= 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 = C LC_TELEPHONE = # # [11] LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # #[1]统计图形grDevices跑龙套数据集方法基础# # # #其他附加包:# # [1]BiocParallel_1.18.0 BiocNeighbors_1.2.0 knitr_1.22 # # [4] BiocStyle_2.12.0 # # # #通过加载一个名称空间(而不是附加):# # [1]Rcpp_1.0.1 bookdown_0.9 digest_0.6.18 # # [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 stringr_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 x。“快速准确再邻居高维搜索使用k - means聚类算法和三角不等式。”Proc Int Jt Conf神经43 (6):2351 - 8。

Yianilos, p . n . 1993。“数据结构和算法的最近邻搜索一般度量空间。“在苏打水,93:311-21。194年。