# source:framspy/evolalg/dissimilarity/dissimilarity.py@1145

Last change on this file since 1145 was 1145, checked in by Maciej Komosinski, 3 years ago

Added niching and novelty search with limited (i.e., local) competition ("nearest neighbors" according to dissimilarity measure)

File size: 1.2 KB
Line
1from abc import ABC
2
3from evolalg.base.step import Step
4import numpy as np
5
6
7class Dissimilarity(Step, ABC):
8
9    def __init__(self, reduction="mean", output_field="dissim", knn=None, *args, **kwargs):
10        super(Dissimilarity, self).__init__(*args, **kwargs)
11
12        self.output_field = output_field
13        self.fn_reduce = None
14        self.knn = knn
15        if reduction == "mean": # TODO change this 'elif' sequence to dictionary?
16            self.fn_reduce = np.mean
17        elif reduction == "max":
18            self.fn_reduce = np.max
19        elif reduction == "min":
20            self.fn_reduce = np.min
21        elif reduction == "sum":
22            self.fn_reduce = np.sum
23        elif reduction == "knn_mean":
24            self.fn_reduce = self.knn_mean
25        elif reduction == "none" or reduction is None:
26            self.fn_reduce = None
27        else:
28            raise ValueError("Unknown reduction type. Supported: mean, max, min, sum, knn_mean, none")
29
30    def reduce(self, dissim_matrix):
31        if self.fn_reduce is None:
32            return dissim_matrix
33        return self.fn_reduce(dissim_matrix, axis=1)
34
35    def knn_mean(self, dissim_matrix,axis):
36        return np.mean(np.partition(dissim_matrix, self.knn)[:,:self.knn],axis=axis)
Note: See TracBrowser for help on using the repository browser.