Algorithm-KernelKMeans

 view release on metacpan or  search on metacpan

t/02_pp_impl.t  view on Meta::CPAN


lives_ok {
  Algorithm::KernelKMeans::PP->new(
    vertices => \@vertices,
    kernel => generate_polynominal_kernel(1, 2)
  );
} 'Kernel function can be set';

lives_ok {
  Algorithm::KernelKMeans::PP->new(
    vertices => \@vertices,
    kernel_matrix => \@kernel_matrix
  );
} 'Kernel matrix can be speficied manually';

dies_ok {
  Algorithm::KernelKMeans::PP->new(
    vertices => \@vertices,
    kernel_matrix => [ @kernel_matrix[0 .. 31] ]
  );
} 'Kernel matrix must be bigger than NxN (N is number of vertices)';

sub sort_cluster {
  [ sort {
    $a->{0} <=> $b->{0} or $a->{1} <=> $b->{1} or $a->{2} <=> $b->{2}
  } @{ +shift } ]
}

{
  my $kkm = Algorithm::KernelKMeans::PP->new(
    vertices => \@vertices,
    kernel => generate_polynominal_kernel(0, 1) # just inner product
  );
  my $kkm_clusters = $kkm->run(k => 6, shuffle => 0);
  my @kkm_clusters = map { sort_cluster $_ } @$kkm_clusters;

  my $nkm = Algorithm::NaiveKMeans->new(vertices => \@vertices);
  my $nkm_clusters = $nkm->run(k => 6, shuffle => 0);
  my @nkm_clusters = map { sort_cluster $_ } @$nkm_clusters;

  is_deeply \@kkm_clusters, \@nkm_clusters,
    'WKKM with uniform weights and identity kernel is equivalant to naive KM';
}

{
  my $kkm = Algorithm::KernelKMeans::PP->new(
    vertices => \@vertices,
    kernel => generate_polynominal_kernel(1, 2)
  );

  dies_ok {
    $kkm->run;
  } '"k" is required';

  dies_ok {
    $kkm->run(k =>  6, k_min => 10);
  } '"k_min" must be less than or equal to "k"';

  dies_ok {
    $kkm->run(k => 6, foo => 'bar');
  } 'Unkown parameter should be error';

  my @clusters1 = map { sort_cluster $_ } @{ $kkm->run(k => 6, shuffle => 0) };
  my @clusters2 = map { sort_cluster $_ } @{ $kkm->run(k => 6, shuffle => 0) };
  is_deeply \@clusters1, \@clusters2,
    'WKKM with same initial cluster is deterministic';
}

done_testing;



( run in 0.458 second using v1.01-cache-2.11-cpan-adec679a428 )