Algorithm-KernelKMeans
view release on metacpan or search on metacpan
lib/Algorithm/KernelKMeans/PP.pm view on Meta::CPAN
package Algorithm::KernelKMeans::PP;
use 5.010;
use namespace::autoclean;
use Carp;
use List::Util qw/shuffle sum/;
use List::MoreUtils qw/natatime pairwise/;
use Moose;
use MooseX::Types::Common::Numeric qw/PositiveNum/;
use MooseX::Types::Moose qw/ArrayRef HashRef CodeRef/;
use POSIX qw/floor/;
use Algorithm::KernelKMeans::Util qw/generate_polynominal_kernel/;
our $DEBUG = 0;
our $VERSION = '0.02';
has 'vertices' => (
is => 'ro',
isa => ArrayRef[ HashRef[PositiveNum] ],
required => 1,
traits => [qw/Array/],
handles => +{
num_vertices => 'count',
vertex => 'get'
}
);
has 'weights' => (
is => 'ro',
isa => ArrayRef[PositiveNum],
lazy => 1,
builder => '_build_weights',
traits => [qw/Array/],
handles => +{
num_weights => 'count',
weight => 'get'
}
);
has 'kernel' => (
is => 'ro',
isa => CodeRef,
lazy => 1,
builder => '_build_kernel'
);
# vertex index -> vertex index -> kernel
# Note that the clusterer only uses lower triangle part of the matrix.
# i.e. It is assumed that K(x1, x2) = K(x2, x1)
has 'kernel_matrix' => (
is => 'ro',
isa => ArrayRef[ ArrayRef[PositiveNum] ],
lazy => 1,
builder => '_build_kernel_matrix'
);
sub _build_weights { [ (1) x shift->num_vertices ] }
# Polynorminal kernel K(x1, x2) = (1 + x1x2)^2
sub _build_kernel { generate_polynominal_kernel(1, 2) }
sub _build_kernel_matrix {
( run in 1.711 second using v1.01-cache-2.11-cpan-5a3173703d6 )