155 lines
3.7 KiB
Python
155 lines
3.7 KiB
Python
"""
|
|
fuzzy_logic.py : General logical operations on fuzzy membership functions,
|
|
a.k.a. fuzzy sets.
|
|
"""
|
|
|
|
import numpy as np
|
|
|
|
|
|
def _resampleuniverse(x, mfx, y, mfy):
|
|
"""
|
|
Resamples fuzzy universes `x` and `y` to include the full range of either
|
|
universe, with resolution of the lowest difference between any two
|
|
reported points.
|
|
|
|
"""
|
|
minstep = np.asarray([np.diff(x).min(), np.diff(y).min()]).min()
|
|
|
|
mi = min(x.min(), y.min())
|
|
ma = max(x.max(), y.max())
|
|
z = np.r_[mi:ma:minstep]
|
|
|
|
xidx = np.argsort(x)
|
|
mfx = mfx[xidx]
|
|
x = x[xidx]
|
|
mfx2 = np.interp(z, x, mfx)
|
|
|
|
yidx = np.argsort(y)
|
|
mfy = mfy[yidx]
|
|
y = y[yidx]
|
|
mfy2 = np.interp(z, y, mfy)
|
|
|
|
return z, mfx2, mfy2
|
|
|
|
|
|
def fuzzy_norm(x, mfx, y, mfy, norm):
|
|
"""
|
|
Fuzzy operator, logic operatrion of two fuzzy sets.
|
|
|
|
Parameters
|
|
----------
|
|
x : 1d array
|
|
Universe variable for fuzzy membership function `mfx`.
|
|
mfx : 1d array
|
|
Fuzzy membership function for universe variable `x`.
|
|
y : 1d array
|
|
Universe variable for fuzzy membership function `mfy`.
|
|
mfy : 1d array
|
|
Fuzzy membership function for universe variable `y`.
|
|
norm : Function
|
|
T-norm or T-conorm (S-norm)
|
|
|
|
Returns
|
|
-------
|
|
z : 1d array
|
|
Universe variable for union of the two provided fuzzy sets.
|
|
mfz : 1d array
|
|
Fuzzy membership function, the result of the operation
|
|
of `mfx` and `mfy`.
|
|
|
|
Notes
|
|
-------
|
|
See `T-Norm <https://en.wikipedia.org/wiki/T-norm>`_ for t-norms.
|
|
|
|
"""
|
|
# Check if universes are the same
|
|
sameuniverse = False
|
|
if x.shape == y.shape and (x == y).all():
|
|
z = x
|
|
mfx2 = mfx
|
|
mfy2 = mfy
|
|
sameuniverse = True
|
|
|
|
if not sameuniverse:
|
|
z, mfx2, mfy2 = _resampleuniverse(x, mfx, y, mfy)
|
|
|
|
return z, norm(mfx2, mfy2)
|
|
|
|
|
|
def fuzzy_and(x, mfx, y, mfy):
|
|
"""
|
|
Fuzzy AND operator, a.k.a. the intersection of two fuzzy sets.
|
|
|
|
Parameters
|
|
----------
|
|
x : 1d array
|
|
Universe variable for fuzzy membership function `mfx`.
|
|
mfx : 1d array
|
|
Fuzzy membership function for universe variable `x`.
|
|
y : 1d array
|
|
Universe variable for fuzzy membership function `mfy`.
|
|
mfy : 1d array
|
|
Fuzzy membership function for universe variable `y`.
|
|
|
|
Returns
|
|
-------
|
|
z : 1d array
|
|
Universe variable for union of the two provided fuzzy sets.
|
|
mfz : 1d array
|
|
Fuzzy AND (intersection) of `mfx` and `mfy`.
|
|
|
|
"""
|
|
# Check if universes are the same
|
|
return fuzzy_norm(x, mfx, y, mfy, norm=np.fmin)
|
|
|
|
|
|
def fuzzy_or(x, mfx, y, mfy):
|
|
"""
|
|
Fuzzy OR operator, a.k.a. union of two fuzzy sets.
|
|
|
|
Parameters
|
|
----------
|
|
x : 1d array
|
|
Universe variable for fuzzy membership function `mfx`.
|
|
mfx : 1d array
|
|
Fuzzy membership function for universe variable `x`.
|
|
y : 1d array
|
|
Universe variable for fuzzy membership function `mfy`.
|
|
mfy : 1d array
|
|
Fuzzy membership function for universe variable `y`.
|
|
|
|
Returns
|
|
-------
|
|
z : 1d array
|
|
Universe variable for intersection of the two provided fuzzy sets.
|
|
mfz : 1d array
|
|
Fuzzy OR (union) of `mfx` and `mfy`.
|
|
|
|
"""
|
|
# Check if universes are the same
|
|
return fuzzy_norm(x, mfx, y, mfy, norm=np.fmax)
|
|
|
|
|
|
def fuzzy_not(mfx):
|
|
"""
|
|
Fuzzy NOT operator, a.k.a. complement of a fuzzy set.
|
|
|
|
Parameters
|
|
----------
|
|
mfx : 1d array
|
|
Fuzzy membership function.
|
|
|
|
Returns
|
|
-------
|
|
mfz : 1d array
|
|
Fuzzy NOT (complement) of `mfx`.
|
|
|
|
Notes
|
|
-----
|
|
This operation does not require a universe variable, because the
|
|
complement is defined for a single set. The output remains defined on the
|
|
same universe.
|
|
|
|
"""
|
|
return 1. - mfx
|