Math::Vector::Real::kdTree(3pm) | User Contributed Perl Documentation | Math::Vector::Real::kdTree(3pm) |
Math::Vector::Real::kdTree - kd-Tree implementation on top of Math::Vector::Real
use Math::Vector::Real::kdTree; use Math::Vector::Real; use Math::Vector::Real::Random; my @v = map Math::Vector::Real->random_normal(4), 1..1000; my $tree = Math::Vector::Real::kdTree->new(@v); my $ix = $tree->find_nearest_vector(V(0, 0, 0, 0)); say "nearest vector is $ix, $v[$ix]";
This module implements a kd-Tree data structure in Perl and common algorithms on top of it.
The following methods are provided:
Returns the index assigned to the first point inserted.
If $max_d is defined, the search is limited to the points within that distance
Optionally, a list of point indexes to be excluded from the search can be passed or, alternatively, a reference to a hash containing the indexes of the points to be excluded.
It is equivalent to the following code (though, it uses a better algorithm):
@ix = map { scalar $t->nearest_vector($t->at($_), undef, $_) } 0..($t->size - 1);
The other arguments have the same meaning as for the method "find_nearest_vector".
The optional argument $min_d specifies a minimal distance. Undef is returned when not point farthest that it is found.
@but_ix specifies points that should not be considered when looking for the farthest point.
In scalar context, just the distance is returned.
There isn't any guarantee on the quality of the generated seeds, but the used algorithm seems to perform well in practice.
In scalar context returns the number of points found. In list context returns the indexes of the points.
If the extra argument $but is provided. The point with that index is ignored.
In scalar context returns the number of points found. In list context returns the indexes of the points.
If the extra argument $but is provided. The point with that index is ignored.
The module can be used to calculate the k-means of a set of vectors as follows:
# inputs my @v = ...; my $k = ...; # k-mean calculation my $t = Math::Vector::Real::kdTree->new(@v); my @means = $t->k_means_seed($k); @means = $t->k_means_loop(@means); @assign = $t->k_means_assign(@means); my @cluster = map [], 1..$k; for (0..$#assign) { my $cluster_ix = $assign[$_]; my $cluster = $cluster[$cluster_ix]; push @$cluster, $t->at($_); } use Data::Dumper; print Dumper \@cluster;
Wikipedia k-d Tree entry <http://en.wikipedia.org/wiki/K-d_tree>.
K-means filtering algorithm <https://www.cs.umd.edu/~mount/Projects/KMeans/pami02.pdf>.
Math::Vector::Real
Copyright (C) 2011-2015 by Salvador Fandiño <sfandino@yahoo.com>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.12.3 or, at your option, any later version of Perl 5 you may have available.
2022-06-15 | perl v5.34.0 |