AI-NeuralNet-FastSOM
    
    
  
  
  
view release on metacpan or search on metacpan
	- added original AI::NN::SOM test suite (and it works!)
0.04  Sat Jul 18 16:45:27 2009
	- removed dependence on Inline::C
	- minor refactor
0.03  Sat Jul 18 09:30:08 2009
	- created wrappers for most c-level stuff
0.02  Wed Jul 15 18:56:13 2009
	- moved data structures into C structs
0.01  Thu Jul  2 09:07:01 2009
	- original version; created by h2xs 1.23 with options
		-AXn AI::NeuralNet::FastSOM
	dXSARGS;
	if ( !(mg = selfmagic(self)) )
		croak("self has no magic!");
	som = self2somptr(self,mg);
	if ( epochs < 1 )
		epochs = 1;
	if ( items < 3 )
		croak("no data to learn");
	oitems = items - 2;
	Newx(org,oitems,AV*);
	Newx(veg,oitems,AV*);
	for ( i=2 ; i<items ; i++ )
		if ( SvTYPE(SvRV(ST(i))) != SVt_PVAV )
			croak("training item %i is not an array ref", (int)i);
		else
			org[i-2] = (AV*)SvRV(ST(i));
t/orig/torus.t
t/pods.t
t/rect.t
t/rect_retrieve.t
t/som.t
t/torus.t
t/torus_retrieve.t
TODO
typemap.v1
typemap.v2
META.json                                Module JSON meta-data (added by MakeMaker)
lib/AI/NeuralNet/FastSOM.pm view on Meta::CPAN
	return defined $v
		? $self->{map}[$x][$y] = $v
		: $self->{map}[$x][$y];
}
sub mean_error {
    my $self = shift;
    my $error = 0;
    map { $error += $_ }                    # then add them all up
        map { ( $self->bmu($_) )[2] }       # then find the distance
           @_;                              # take all data vectors
    return ($error / scalar @_);            # return the mean value
}
XSLoader::load(__PACKAGE__);
1;
__END__
=pod
lib/AI/NeuralNet/FastSOM/Hexa.pm view on Meta::CPAN
use warnings;
use AI::NeuralNet::FastSOM;
our @ISA = qw/AI::NeuralNet::FastSOM/;
our $VERSION = '0.19';
sub radius   { shift->{_R} }
sub diameter { shift->{_X} }
sub as_data   { die 'not implemented' }
sub as_string { die 'not implemented' }
sub initialize {
    my $self = shift;
    my @data = @_;
    our $i = 0;
    my $get_from_stream = sub {
        $i = 0 if $i > $#data;
        return [ @{ $data[$i++] } ];  # cloning !
    } if @data;
    $get_from_stream ||= sub {
        return [ map { rand( 1 ) - 0.5 } 1..$self->{_Z} ];
    };
    for my $x (0 .. $self->{_X}-1) {
        for my $y (0 .. $self->{_X}-1) {
            $self->{map}->[$x]->[$y] = &$get_from_stream;
        }
    }
}
lib/AI/NeuralNet/FastSOM/Hexa.pm view on Meta::CPAN
           <0,1>   <1,0>
       <0,2>   <1,1>   <2,0>
   <0,3>   <1,2>   <2,1>   <3,0>
  ...............................
=item I<as_string>
Not implemented.
=item I<as_data>
Not implemented.
=back
=head1 AUTHOR
Rick Myers, E<lt>jrm@cpan.orgE<gt>
=head1 COPYRIGHT AND LICENSE
lib/AI/NeuralNet/FastSOM/Rect.pm view on Meta::CPAN
use AI::NeuralNet::FastSOM;
our @ISA = qw/AI::NeuralNet::FastSOM/;
our $VERSION = '0.19';
sub _old_radius { shift->{_R} }
sub initialize {
    my $self = shift;
    my @data = @_;
    my $i = 0;
    my $get_from_stream = sub {
        $i = 0 if $i > $#data;
        return [ @{ $data[$i++] } ];  # cloning !
    } if @data;
    $get_from_stream ||= sub {
        return [ map { rand( 1 ) - 0.5 } 1..$self->{_Z} ];
    };
    for my $x (0 .. $self->{_X}-1) {
        for my $y (0 .. $self->{_Y}-1) {
            $self->{map}->[$x]->[$y] = &$get_from_stream;
        }
    }
lib/AI/NeuralNet/FastSOM/Rect.pm view on Meta::CPAN
            for my $y (0 .. $self->{_Y}-1){
                $s .= sprintf("% 2.2f ", $self->{map}->[$x]->[$y]->[$w]);
            }
            $s .= "\n";
        }
        $s .= "\n";
    }
    return $s;
}
sub as_data {
    my $self = shift;
    my $s = '';
    my $dim = scalar @{ $self->{map}->[0]->[0] };
    for my $x (0 .. $self->{_X}-1) {
        for my $y (0 .. $self->{_Y}-1){
            for my $w ( 0 .. $dim-1 ){
                $s .= sprintf("\t%f", $self->{map}->[$x]->[$y]->[$w]);
            }
            $s .= "\n";
lib/AI/NeuralNet/FastSOM/Rect.pm view on Meta::CPAN
  use AI::NeuralNet::FastSOM::Rect;
  my $nn = new AI::NeuralNet::FastSOM::Rect (output_dim => "5x6",
                                         input_dim  => 3);
  $nn->initialize;
  $nn->train (30, 
    [ 3, 2, 4 ], 
    [ -1, -1, -1 ],
    [ 0, 4, -3]);
  print $nn->as_data;
=head1 INTERFACE
=head2 Constructor
The constructor takes the following arguments (additionally to those in
the base class):
=over
lib/AI/NeuralNet/FastSOM/Rect.pm view on Meta::CPAN
Example:
   my $m = $nn->map;
   for my $x (0 .. 5) {
       for my $y (0 .. 4){
           warn "vector at $x, $y: ". Dumper $m->[$x]->[$y];
       }
   }
=item I<as_data>
print I<$nn>->as_data
This methods creates a string containing the raw vector data, row by
row. This can be fed into gnuplot, for instance.
=back
=head1 SEE ALSO
L<http://www.ai-junkie.com/ann/som/som1.html>
=head1 AUTHOR
t/orig/rect.t view on Meta::CPAN
    foreach my $x ( 0 .. 4 ) {
	foreach my $y ( 0 .. 5 ) {
	    return 1 if AI::NeuralNet::FastSOM::Utils::vector_distance ($m->[$x]->[$y], $v) < 0.01;
	}
    }
    return 0;
}
    ok ($nn->as_string, 'pretty print');
    ok ($nn->as_data, 'raw format');
#    print $nn->as_string;
}
{
    my $nn = new AI::NeuralNet::FastSOM::Rect (output_dim => "5x6",
					   input_dim  => 3);
    $nn->initialize;
    foreach my $x (0 .. 5 -1) {
t/orig/torus.t view on Meta::CPAN
    foreach my $x ( 0 .. 4 ) {
	foreach my $y ( 0 .. 5 ) {
	    return 1 if AI::NeuralNet::FastSOM::Utils::vector_distance ($m->[$x]->[$y], $v) < 0.01;
	}
    }
    return 0;
}
    ok ($nn->as_string, 'pretty print');
    ok ($nn->as_data, 'raw format');
#    print $nn->as_string;
}
__END__
# randomized pick
    @vectors = ...;
my $get = sub {
    return @vectors [ int (rand (scalar @vectors) ) ];
    $nn->initialize;
    my @vs = ([ 3, 2, 4 ], [ -1, -1, -1 ], [ 0, 4, -3]);
    $nn->train(400, @vs);
    for my $v (@vs) {
        ok(_find($v,$nn->map),'found learned vector '.join(",", @$v));
    }
    ok ($nn->as_string, 'pretty print');
    ok ($nn->as_data, 'raw format');
}
{
    my $nn = new AI::NeuralNet::FastSOM::Rect (output_dim => "5x6",
                       input_dim  => 3);
    $nn->initialize;
    for my $x (0 .. 5 -1) {
        for my $y (0 .. 6 -1 ) {
            ok ( (!grep { $_ > 0.5 || $_ < -0.5 } @{ $nn->value ( $x, $y ) }) , "$x, $y: random vectors in [-0.5, 0.5]");
    my @vs = ([ 3, 2, 4 ], [ -1, -1, -1 ], [ 0, 4, -3]);
    $nn->train(400, @vs);
    for my $v (@vs) {
        ok( _find($v, $nn->map), 'found learned vector '. join (",", @$v) );
    }
    ok( $nn->as_string, 'pretty print' );
    ok( $nn->as_data, 'raw format' );
}
{
    my $nn = AI::NeuralNet::FastSOM::Torus->new(
        output_dim => '5x6',
        input_dim  => 3,
    );
    $nn->initialize;
    my @vs = ([ 3, 2, 4 ], [ -1, -1, -1 ], [ 0, 4, -3]);
( run in 1.686 second using v1.01-cache-2.11-cpan-5dc5da66d9d )