Copyright | (c) 2012-2021 Amy de Buitléir |
---|---|
License | BSD-style |
Maintainer | amy@nualeargais.ie |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
A Self-generating Model (SGM). An SGM maps input patterns onto a set, where each element in the set is a model of the input data. An SGM is like a Kohonen Self-organising Map (SOM), except:
- Instead of a grid, it uses a simple set of unconnected models. Since the models are unconnected, only the model that best matches the input is ever updated. This makes it faster, however, topological relationships within the input data are not preserved.
- New models are created on-the-fly when no existing model is similar enough to an input pattern. If the SGM is at capacity, the least useful model will be deleted.
This implementation supports the use of non-numeric patterns.
In layman's terms, a SGM can be useful when you you want to build a set of models on some data. A tutorial is available at https://github.com/mhwombat/som/wiki.
References:
- Amy de Buitléir, Mark Daly, and Michael Russell. The Self-generating Model: an Adaptation of the Self-organizing Map for Intelligent Agents and Data Mining. In: Artificial Life and Intelligent Agents: Second International Symposium, ALIA 2016, Birmingham, UK, June 14-15, 2016, Revised Selected Papers. Ed. by Peter R. Lewis et al. Springer International Publishing, 2018, pp. 59–72. Available at http://amydebuitleir.eu/publications/.
- Amy de Buitléir, Michael Russell, and Mark Daly. Wains: A pattern-seeking artificial life species. Artificial Life, (18)4:399–423, 2012. Available at http://amydebuitleir.eu/publications/.
- Kohonen, T. (1982). Self-organized formation of topologically correct feature maps. Biological Cybernetics, 43 (1), 59–69.
Synopsis
- data SGM t x k p = SGM {
- toMap :: Map k (p, t)
- learningRate :: t -> x
- capacity :: Int
- difference :: p -> p -> x
- makeSimilar :: p -> x -> p -> p
- nextIndex :: k
- makeSGM :: Bounded k => (t -> x) -> Int -> (p -> p -> x) -> (p -> x -> p -> p) -> SGM t x k p
- time :: Num t => SGM t x k p -> t
- isEmpty :: SGM t x k p -> Bool
- size :: SGM t x k p -> Int
- modelMap :: SGM t x k p -> Map k p
- counterMap :: SGM t x k p -> Map k t
- modelAt :: Ord k => SGM t x k p -> k -> p
- exponential :: (Floating x, Integral t) => x -> x -> t -> x
- classify :: (Num t, Ord t, Num x, Ord x, Enum k, Ord k) => SGM t x k p -> p -> (k, x, Map k (p, x))
- trainAndClassify :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> p -> (k, x, Map k (p, x), SGM t x k p)
- train :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> p -> SGM t x k p
- trainBatch :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> [p] -> SGM t x k p
- imprint :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> k -> p -> SGM t x k p
- imprintBatch :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> [(k, p)] -> SGM t x k p
- filter :: (p -> Bool) -> SGM t x k p -> SGM t x k p
Construction
A Simplified Self-Organising Map (SGM).
t
is the type of the counter.
x
is the type of the learning rate and the difference metric.
k
is the type of the model indices.
p
is the type of the input patterns and models.
SGM | |
|
Instances
makeSGM :: Bounded k => (t -> x) -> Int -> (p -> p -> x) -> (p -> x -> p -> p) -> SGM t x k p Source #
creates a new SGM that does not (yet)
contain any models.
It will learn at the rate determined by the learning function makeSGM
lr n diff mslr
,
and will be able to hold up to n
models.
It will create a new model based on a pattern presented to it when
the SGM is not at capacity, or a less useful model can be replaced.
It will use the function diff
to measure the similarity between
an input pattern and a model.
It will use the function ms
to adjust models as needed to make
them more similar to input patterns.
Deconstruction
time :: Num t => SGM t x k p -> t Source #
The current "time" (number of times the SGM has been trained).
counterMap :: SGM t x k p -> Map k t Source #
Returns a map from node ID to counter (number of times the node's model has been the closest match to an input pattern).
Learning and classification
exponential :: (Floating x, Integral t) => x -> x -> t -> x Source #
A typical learning function for classifiers.
returns the learning rate at time exponential
r0 d tt
.
When t = 0
, the learning rate is r0
.
Over time the learning rate decays exponentially; the decay rate is
d
.
Normally the parameters are chosen such that:
- 0 < r0 < 1
- 0 < d
classify :: (Num t, Ord t, Num x, Ord x, Enum k, Ord k) => SGM t x k p -> p -> (k, x, Map k (p, x)) Source #
identifies the model classify
s ps
that most closely
matches the pattern p
.
It will not make any changes to the classifier.
(I.e., it will not change the models or match counts.)
Returns the ID of the node with the best matching model,
the difference between the best matching model and the pattern,
and the SGM labels paired with the model and the difference
between the input and the corresponding model.
The final paired list is sorted in decreasing order of similarity.
trainAndClassify :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> p -> (k, x, Map k (p, x), SGM t x k p) Source #
identifies the model in trainAndClassify
s ps
that most
closely matches p
, and updates it to be a somewhat better match.
If necessary, it will create a new node and model.
Returns the ID of the node with the best matching model,
the difference between the pattern and the best matching model
in the original SGM (before training or adding a new model),
the differences between the pattern and each model in the updated
SGM,
and the updated SGM.
train :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> p -> SGM t x k p Source #
identifies the model in train
s ps
that most closely
matches p
, and updates it to be a somewhat better match.
If necessary, it will create a new node and model.
trainBatch :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> [p] -> SGM t x k p Source #
For each pattern p
in ps
,
identifies the
model in trainBatch
s pss
that most closely matches p
,
and updates it to be a somewhat better match.
imprint :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> k -> p -> SGM t x k p Source #
imprintBatch :: (Num t, Ord t, Fractional x, Num x, Ord x, Bounded k, Enum k, Ord k) => SGM t x k p -> [(k, p)] -> SGM t x k p Source #