AI-DecisionTree
view release on metacpan or search on metacpan
Instance/Instance.xs view on Meta::CPAN
{
int *new_values;
int i;
if (attribute >= instance->num_values) {
if (!value) return; /* Nothing to do */
printf("Expanding from %d to %d places\n", instance->num_values, attribute);
Renew(instance->values, attribute, int);
if (!instance->values)
croak("Couldn't grab new memory to expand instance");
for (i=instance->num_values; i<attribute-1; i++)
instance->values[i] = 0;
instance->num_values = 1 + attribute;
}
instance->values[attribute] = value;
}
int
lib/AI/DecisionTree.pm view on Meta::CPAN
my ($self, %args) = @_;
if (not @{ $self->{instances} }) {
croak "Training data has been purged, can't re-train" if $self->{tree};
croak "Must add training instances before calling train()";
}
$self->_create_lookup_hashes;
local $self->{curr_depth} = 0;
local $self->{max_depth} = $args{max_depth} if exists $args{max_depth};
$self->{depth} = 0;
$self->{tree} = $self->_expand_node( instances => $self->{instances} );
$self->{total_instances} = @{$self->{instances}};
$self->prune_tree if $self->{prune};
$self->do_purge if $self->purge;
return 1;
}
sub do_purge {
my $self = shift;
delete @{$self}{qw(instances attribute_values attribute_values_reverse results results_reverse)};
lib/AI/DecisionTree.pm view on Meta::CPAN
}
# Each node contains:
# { split_on => $attr_name,
# children => { $attr_value1 => $node1,
# $attr_value2 => $node2, ... }
# }
# or
# { result => $result }
sub _expand_node {
my ($self, %args) = @_;
my $instances = $args{instances};
print STDERR '.' if $self->{verbose};
$self->{depth} = $self->{curr_depth} if $self->{curr_depth} > $self->{depth};
local $self->{curr_depth} = $self->{curr_depth} + 1;
$self->{nodes}++;
my %results;
$results{$self->_result($_)}++ foreach @$instances;
lib/AI/DecisionTree.pm view on Meta::CPAN
my %split;
foreach my $i (@$instances) {
my $v = $self->_value($i, $best_attr);
push @{$split{ defined($v) ? $v : '<undef>' }}, $i;
}
die ("Something's wrong: attribute '$best_attr' didn't split ",
scalar @$instances, " instances into multiple buckets (@{[ keys %split ]})")
unless keys %split > 1;
foreach my $value (keys %split) {
$node{children}{$value} = $self->_expand_node( instances => $split{$value} );
}
return \%node;
}
sub best_attr {
my ($self, $instances) = @_;
# 0 is a perfect score, entropy(#instances) is the worst possible score
( run in 1.122 second using v1.01-cache-2.11-cpan-97f6503c9c8 )