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 )