AI-NeuralNet-Hopfield
view release on metacpan or search on metacpan
lib/AI/NeuralNet/Hopfield.pm view on Meta::CPAN
package AI::NeuralNet::Hopfield;
use v5.10;
use strict;
use warnings;
use Moose;
use Math::SparseMatrix;
=head1 NAME
AI::NeuralNet::Hopfield - A simple Hopfiled Network Implementation.
=head1 VERSION
Version 0.1
=cut
our $VERSION = '0.1';
has 'matrix' => ( is => 'rw', isa => 'Math::SparseMatrix');
has 'matrix_rows' => ( is => 'rw', isa => 'Int');
has 'matrix_cols' => ( is => 'rw', isa => 'Int');
sub BUILD {
my $self = shift;
my $args = shift;
my $matrix = Math::SparseMatrix->new($args->{row}, $args->{col});
$self->matrix($matrix);
$self->matrix_rows($args->{row});
$self->matrix_cols($args->{col});
}
sub train() {
my $self = shift;
my @pattern = @_;
if ( ($#pattern + 1) != $self->matrix_rows) {
die "Can't train a pattern of size " . ($#pattern + 1) . " on a hopfield network of size " , $self->matrix_rows;
}
my $m2 = &convert_array($self->matrix_rows, $self->matrix_cols, @pattern);
my $m1 = &transpose($m2);
my $m3 = &multiply($m1, $m2);
my $identity = &identity($m3->{_rows});
my $m4 = &subtract($m3, $identity);
my $m5 = &add($self->matrix, $m4);
$self->matrix($m5);
}
sub evaluate() {
my $self = shift;
my @pattern = @_;
my @output = ();
my $input_matrix = &convert_array($self->matrix_rows, $self->matrix_cols, @pattern);
for (my $col = 1; $col <= ($#pattern + 1); $col++) {
my $column_matrix = &get_col($self, $col);
my $transposed_column_matrix = &transpose($column_matrix);
my $dot_product = &dot_product($input_matrix, $transposed_column_matrix);
#say $dot_product;
if ($dot_product > 0) {
$output[$col - 1] = "true";
} else {
$output[$col - 1] = "false";
}
}
return @output;
}
sub convert_array() {
my $rows = shift;
my $cols = shift;
my @pattern = @_;
my $result = Math::SparseMatrix->new(1, $cols);
for (my $i = 0; $i < ($#pattern + 1); $i++) {
if ($pattern[$i] =~ m/true/ig) {
$result->set(1, ($i +1 ), 1);
} else {
$result->set(1, ($i + 1), -1);
}
}
return $result;
}
sub transpose() {
my $matrix = shift;
my $rows = $matrix->{_rows};
my $cols = $matrix->{_cols};
my $inverse = Math::SparseMatrix->new($cols, $rows);
for (my $r = 1; $r <= $rows; $r++) {
for (my $c = 1; $c <= $cols; $c++) {
my $value = $matrix->get($r, $c);
$inverse->set($c, $r, $value);
}
}
return $inverse;
}
sub multiply() {
my $matrix_a = shift;
lib/AI/NeuralNet/Hopfield.pm view on Meta::CPAN
sub get_col() {
my $self = shift;
my $col = shift;
my $matrix = $self->matrix();
my $matrix_rows = $self->matrix_rows();
if ($col > $matrix_rows) {
die "Can't get column";
}
my $new_matrix = Math::SparseMatrix->new($matrix_rows, 1);
for (my $row = 1; $row <= $matrix_rows; $row++) {
my $value = $matrix->get($row, $col);
$new_matrix->set($row, 1, $value);
}
return $new_matrix;
}
sub print_matrix() {
my $matrix = shift;
my $rs = $matrix->{_rows};
my $cs = $matrix->{_cols};
for (my $i = 1; $i <= $rs; $i++) {
for (my $j = 1; $j <= $cs; $j++) {
say "[$i,$j]" . $matrix->get($i, $j);
}
}
}
=head1 SYNOPSIS
This is a version of a Hopfield Network implemented in Perl. Hopfield networks are sometimes called associative networks since
they associate a class pattern to each input pattern, they are tipically used for classification problems with binary pattern vectors.
=head1 SUBROUTINES/METHODS
=head2 New
In order to build new calssifiers, you have to pass to the constructor the number of rows and columns (neurons) for the matrix construction.
my $hop = AI::NeuralNet::Hopfield->new(row => 4, col => 4);
=cut
=head2 Train
The training method configurates the network memory.
my @input_1 = qw(true true false false);
$hop->train(@input_1);
=cut
=head2 Evaluation
The evaluation method compares the new input with the information stored in the matrix memory.
The output is a new array with the boolean evaluation of each neuron.
my @input_2 = qw(true true true false);
my @result = $hop->evaluate(@input_2);
=cut
=head1 AUTHOR
Felipe da Veiga Leprevost, C<< <leprevost at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-neuralnet-hopfield at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-NeuralNet-Hopfield>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::NeuralNet::Hopfield
You can also look for information at:
=over 4
=item * RT: CPAN's request tracker (report bugs here)
L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=AI-NeuralNet-Hopfield>
=item * AnnoCPAN: Annotated CPAN documentation
L<http://annocpan.org/dist/AI-NeuralNet-Hopfield>
=item * CPAN Ratings
L<http://cpanratings.perl.org/d/AI-NeuralNet-Hopfield>
=item * Search CPAN
L<http://search.cpan.org/dist/AI-NeuralNet-Hopfield/>
=back
=head1 ACKNOWLEDGEMENTS
=head1 LICENSE AND COPYRIGHT
Copyright 2013 leprevost.
This program is free software; you can redistribute it and/or modify it
under the terms of the the Artistic License (2.0). You may obtain a
copy of the full license at:
L<http://www.perlfoundation.org/artistic_license_2_0>
Any use, modification, and distribution of the Standard or Modified
Versions is governed by this Artistic License. By using, modifying or
( run in 0.933 second using v1.01-cache-2.11-cpan-5a3173703d6 )