AI-NaiveBayes
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
use AI::NaiveBayes::Learner;
use Moose;
use MooseX::Storage;
use List::Util qw(max);
with Storage(format => 'Storable', io => 'File');
has model => (is => 'ro', isa => 'HashRef[HashRef]', required => 1);
sub train {
my $self = shift;
my $learner = AI::NaiveBayes::Learner->new();
for my $example ( @_ ){
$learner->add_example( %$example );
}
return $learner->classifier;
}
sub classify {
my ($self, $newattrs) = @_;
$newattrs or die "Missing parameter for classify()";
my $m = $self->model;
# Note that we're using the log(prob) here. That's why we add instead of multiply.
my %scores = %{$m->{prior_probs}};
my %features;
while (my ($feature, $value) = each %$newattrs) {
lib/AI/NaiveBayes/Learner.pm view on Meta::CPAN
package AI::NaiveBayes::Learner;
$AI::NaiveBayes::Learner::VERSION = '0.04';
use strict;
use warnings;
use 5.010;
use List::Util qw( min sum );
use Moose;
use AI::NaiveBayes;
has attributes => (is => 'ro', isa => 'HashRef', default => sub { {} }, clearer => '_clear_attrs');
has labels => (is => 'ro', isa => 'HashRef', default => sub { {} }, clearer => '_clear_labels');
has examples => (is => 'ro', isa => 'Int', default => 0, clearer => '_clear_examples');
has features_kept => (is => 'ro', predicate => 'limit_features');
has classifier_class => ( is => 'ro', isa => 'Str', default => 'AI::NaiveBayes' );
sub add_example {
my ($self, %params) = @_;
for ('attributes', 'labels') {
die "Missing required '$_' parameter" unless exists $params{$_};
}
$self->{examples}++;
my $attributes = $params{attributes};
my $labels = $params{labels};
add_hash($self->attributes(), $attributes);
my $our_labels = $self->labels;
foreach my $label ( @$labels ) {
$our_labels->{$label}{count}++;
$our_labels->{$label}{attributes} //= {};
add_hash($our_labels->{$label}{attributes}, $attributes);
}
}
sub classifier {
my $self = shift;
my $examples = $self->examples;
my $labels = $self->labels;
my $vocab_size = keys %{ $self->attributes };
my $model;
$model->{attributes} = $self->attributes;
# Calculate the log-probabilities for each category
t/02-predict.t view on Meta::CPAN
$classifier = $lr->classifier;
# Predict
$s = $classifier->classify( _hash(qw(jakis tekst po polsku)) );
$h = $s->label_sums;
ok(abs( 3 - $h->{farming} / $h->{vampire} ) < 0.01, 'Prior probabillities' );
################################################################
sub _hash { +{ map {$_,1} @_ } }
t/default_training.t view on Meta::CPAN
{
attributes => _hash(qw(vampires cannot see their images mirrors)),
labels => ['vampire']
},
);
isa_ok( $classifier, 'AI::NaiveBayes' );
################################################################
sub _hash { +{ map {$_,1} @_ } }
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.329 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )