Title: | Nearest Neighbour Search with Variables on a Torus |
Version: | 1.0.3 |
Date: | 2023-09-02 |
Description: | Finds the k nearest neighbours in a dataset of specified points, adding the option to wrap certain variables on a torus. The user chooses the algorithm to use to find the nearest neighbours. Two such algorithms, provided by the packages 'RANN' https://cran.r-project.org/package=RANN, and 'nabor' https://cran.r-project.org/package=nabor, are suggested. |
Imports: | graphics |
License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
Encoding: | UTF-8 |
Depends: | R (≥ 3.3.0) |
RoxygenNote: | 7.2.3 |
Suggests: | knitr, nabor, RANN, rmarkdown, testthat (≥ 2.1.0) |
VignetteBuilder: | knitr |
URL: | https://github.com/paulnorthrop/donut, https://paulnorthrop.github.io/donut/ |
BugReports: | https://github.com/paulnorthrop/donut/issues |
Config/testthat/edition: | 3 |
NeedsCompilation: | no |
Packaged: | 2023-09-02 21:55:14 UTC; paul |
Author: | Paul J. Northrop [aut, cre, cph] |
Maintainer: | Paul J. Northrop <p.northrop@ucl.ac.uk> |
Repository: | CRAN |
Date/Publication: | 2023-09-02 22:20:08 UTC |
donut: Nearest Neighbour Search with Variables on a Torus
Description
Finds the k
nearest neighbours in a dataset of specified points,
adding the option to wrap certain variables on a torus. The user chooses
the algorithm to use to find the nearest neighbours.
Details
The function nnt
performs the nearest neighbour
search. There is also a rudimentary plot method: plot.nnt
.
The default algorithm is that provided by the function
nn2
in the RANN-package
.
Another possibility is the knn
function in the
nabor-package
.
See vignette("donut-vignette", package = "donut")
for an
overview of the package.
Author(s)
Maintainer: Paul J. Northrop p.northrop@ucl.ac.uk [copyright holder]
References
Arya, S., Mount, D., Kemp, S. E. and Jefferis, G. (2019) RANN: Fast Nearest Neighbour Search (Wraps ANN Library) Using L2 Metric. R package version 2.6.1. https://CRAN.R-project.org/package=RANN
Elseberg J., Magnenat S., Siegwart R., Nuchter, A. (2012) Comparison of nearest-neighbor-search strategies and implementations for efficient shape registration. Journal of Software Engineering for Robotics (JOSER), 3(1), 2-12 https://CRAN.R-project.org/package=nabor
See Also
nnt
for nearest neighbour with some variables
wrapped on a torus.
plot.nnt
plot method for objects returned from
nnt
(1 and 2 dimensional data only).
Internal donut functions
Description
Internal donut functions
Usage
method1_function(data, query, k, torus, ranges, fn, ...)
method2_function(data, query, k, torus, ranges, fn, ...)
fac3(d)
Details
These functions are not intended to be called by the user.
Nearest Neighbour Search with Variables on a Torus
Description
Uses a user-supplied function to find the k
nearest neighbours of
specified points in a dataset, adding the option to wrap certain variables
on a torus.
Usage
nnt(
data,
query = data,
k = min(10, nrow(data)),
fn = RANN::nn2,
torus,
ranges,
method = 1,
...
)
Arguments
data |
An |
query |
An |
k |
An integer scalar. The number of nearest neighbours, of the
points in the rows of |
fn |
The function with which to calculate the nearest neighbours.
The syntax of this function must be |
torus |
An integer vector with element(s) in
{1, ..., |
ranges |
A |
method |
An integer scalar, equal to 1 or 2. See Details. |
... |
Further arguments to be passed to |
Details
If method = 1
then the data are partially replicated, arranged
around the original data in a way that wraps the variables in torus
on their respective
ranges in ranges
. Then fn
is called using this replicated
dataset as the argument data
. If k
is large and/or
data
is a sparse dataset then it is possible that a single
observation contributes more than once to a set of nearest neighbours,
which is incorrect. If this occurs then nnt
uses method 2 to
correct the offending rows in nn.idx
and nn.dists
in the
returned list object.
If method = 2
then the
following approach is used for the point in each row in query
.
The data indexed by torus
are shifted (and wrapped) so that the
point is located at the respective midpoints of ranges
.
Method 2 is efficient only if the number of points in query
is
small.
If torus
is missing then fn
is called using
fn(data = data, query = query, k = k, ...)
, so that a call to
nnt
is equivalent to a call to the function chosen by fn
.
Value
An object (a list) of class c("nnt", "donut")
containing the
following components.
nn.idx |
An |
nn.dists |
An |
data , query , k , fn |
The arguments |
torus , ranges , method |
If |
call |
The call to |
References
Arya, S., Mount, D., Kemp, S. E. and Jefferis, G. (2019) RANN: Fast Nearest Neighbour Search (Wraps ANN Library) Using L2 Metric. R package version 2.6.1. https://CRAN.R-project.org/package=RANN
Elseberg J., Magnenat S., Siegwart R., Nuchter, A. (2012) Comparison of nearest-neighbor-search strategies and implementations for efficient shape registration. Journal of Software Engineering for Robotics (JOSER), 3(1), 2-12 https://CRAN.R-project.org/package=nabor
See Also
RANN::nn2
,
nabor::knn
: nearest neighbour searches.
plot.nnt
plot method for objects returned from
nnt
(1 and 2 dimensional data only).
Examples
got_RANN <- requireNamespace("RANN", quietly = TRUE)
got_nabor <- requireNamespace("nabor", quietly = TRUE)
set.seed(20092019)
# 2D example from the RANN:nn2 documentation (L2 metric)
x1 <- runif(100, 0, 2 * pi)
x2 <- runif(100, 0, 3)
DATA <- data.frame(x1, x2)
if (got_RANN) {
nearest <- nnt(DATA, DATA)
}
# Suppose that x1 should be wrapped
ranges1 <- c(0, 2 * pi)
query1 <- rbind(c(6, 1.3), c(2 * pi, 3), c(3, 1.5), c(4, 0))
if (got_RANN) {
res1 <- nnt(DATA, query1, k = 8, torus = 1, ranges = ranges1)
plot(res1, ylim = c(0, 3))
}
# Suppose that x1 and x2 should be wrapped
ranges2 <- rbind(c(0, 2 * pi), c(0, 3))
query2 <- rbind(c(6, 1.3), c(2 * pi, 3), c(3, 1.5), c(4, 0))
if (got_RANN) {
res2 <- nnt(DATA, query2, k = 8, torus = 1:2, ranges = ranges2)
plot(res2)
}
# Use nabor::knn (L2 metric) instead of RANN::nn2
if (got_nabor) {
res3 <- nnt(DATA, query2, k = 8, fn = nabor::knn, torus = 1:2,
ranges = ranges2)
plot(res3)
}
# 1D example
ranges <- c(0, 2 * pi)
query <- c(4, 0.1)
if (got_RANN) {
res <- nnt(x1, query, torus = 1, ranges = ranges, method = 1)
plot(res)
}
Plot diagnostics for an nnt object
Description
plot
method for an object of class c("nnt")
.
Usage
## S3 method for class 'nnt'
plot(x, ...)
Arguments
x |
an object of class |
... |
Details
This function is only applicable in 1 or 2 dimensions, that is,
when ncol(x$data)
= 1 or 2. It provides a visual check that the
wrapping of variables is working as intended, in cases where the
number of query points, that is, nrow(x$query)
is small
enough that sets of nearest neighbours do not overlap much.
If ncol(x$data)
= 1 then the index of each observation is plotted
against its value, using a plotting character pch = 1
. A vertical
line is superimposed at each value in x$query
and the x$k$
nearest neighbours of each line are colour-coded.
If ncol(x$data)
= 2 then x$data[, 2]
is plotted against
x$data[, 1]
, using a plotting character pch = 1
. Each point
in x$query
is plotted with a cross and the x$k$
nearest neighbours of each point are colour-coded.
Colours of the lines/crosses and nearest neighbour points can be set sing an
argument col
. If a variable is wrapped then the default plotting
limits are set using the corresponding values in x$ranges
.
Value
Nothing is returned.
Examples
See the examples in nnt
.
See Also
nnt
for nearest neighbour with some variables
wrapped on a torus.