Algorithm-AdaBoost

 view release on metacpan or  search on metacpan

lib/Algorithm/AdaBoost.pm  view on Meta::CPAN

package Algorithm::AdaBoost;

use 5.014;
use Algorithm::AdaBoost::Classifier;
use Carp qw//;
use List::Util;
use Smart::Args;

our $VERSION = '0.01';

sub new {
  args
    my $class => 'ClassName',
    my $training_set => +{ isa => 'ArrayRef', optional => 1 },
    my $weak_classifier_generator => +{ isa => 'CodeRef', optional => 1 };

  bless +{
    training_set => $training_set,
    weak_classifier_generator => $weak_classifier_generator,
  } => $class;
}

sub calculate_classifier_weight {
  args
    my $self,
    my $classifier => 'CodeRef',
    my $distribution => 'ArrayRef[Num]';

  my $error_ratio = $self->evaluate_error_ratio(
    classifier => $classifier,
    distribution => $distribution,
  );
  return log((1 - $error_ratio) / $error_ratio) / 2;
}

sub classify {
  args_pos
    my $self,
    my $feature => 'Any';
  Carp::croak 'Training phase is undone yet.' unless $self->trained;
  $self->final_classifier->classify($feature);
}

sub construct_hardest_distribution {
  args
    my $self,
    my $classifier => 'CodeRef',
    my $previous_distribution => 'ArrayRef[Num]',
    my $training_set => 'ArrayRef[HashRef]',
    my $weight => 'Num';

  my @distribution = map {
    my $training_data = $training_set->[$_];
    $previous_distribution->[$_]
      * exp(-$weight * $training_data->{label}
              * $classifier->($training_data->{feature}));
  } 0 .. $#$previous_distribution;
  my $partition_function = List::Util::sum(@distribution);
  [ map { $_ / $partition_function } @distribution ];
}

sub evaluate_error_ratio {
  args
    my $self,
    my $classifier => 'CodeRef',
    my $distribution => 'ArrayRef[Num]';

  my $accuracy = 0;
  for my $i (0 .. $#$distribution) {
    my $training_data = $self->training_set->[$i];
    if ($classifier->($training_data->{feature}) == $training_data->{label}) {
      $accuracy += $distribution->[$i];
    }
  }
  return 1 - $accuracy;
}



( run in 0.494 second using v1.01-cache-2.11-cpan-5623c5533a1 )