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 0.291 second using v1.01-cache-2.11-cpan-8d75d55dd25 )