Build a type-2 inference system
This tutorial explains how to build a type-2 inference system. The reader is assumed to be familiar with the basic syntax to build a fuzzy system, which is described in the Build a Mamdani inference system tutorial.
Read this as Jupyter notebook here
Interval membership function
While a normal membership function associates each element of a fuzzy set ot a membership degree $\mu \in [0, 1]$, an interval membership function associates each element to an interval membership degeee $\overline{\mu}\subseteq[0, 1]$.
The following example shows how to contruct an interval membership function in the library and displays the result.
using FuzzyLogic, Plots
mf = 0.7 * TriangularMF(1, 2, 3) .. TriangularMF(0, 2, 4)
plot(mf, -1, 5)
An interval membership function can be constructed using the ..
operator. The left input is the lower bound and the right input is the upper bound. The expression 0.5 * TriangularMF(1, 2, 3)
constructs a scaled membership.
Type-2 inference systems
A type-2 Mamdani system can be built with the @mamfis
macro, just like type-1, with two differences
- membership functions can be interval membership funcions
- the defuzzifier should be one of the Type-2 defuzzifiers
The following code shows an example of building a type-2 system and performing inference with it.
fis = @mamfis function tipper(service, food)::tip
service := begin
domain = 0:10
poor = 0.8 * GaussianMF(0.0, 1.2) .. GaussianMF(0.0, 1.5)
good = 0.8 * GaussianMF(5.0, 1.2) .. GaussianMF(5.0, 1.5)
excellent = 0.8 * GaussianMF(10.0, 1.2) .. GaussianMF(10.0, 1.5)
end
food := begin
domain = 0:10
rancid = 0.9 * TrapezoidalMF(-1.8, 0.0, 1.0, 2.8) .. TrapezoidalMF(-2, 0, 1, 3)
delicious = 0.9 * TrapezoidalMF(8, 9, 10, 12) .. TrapezoidalMF(7, 9, 10, 12)
end
tip := begin
domain = 0:30
cheap = 0.8 * TriangularMF(1, 5, 9) .. TriangularMF(0, 5, 10)
average = 0.8 * TriangularMF(11, 15, 19) .. TriangularMF(10, 15, 20)
generous = 0.8 * TriangularMF(22, 25, 29) .. TriangularMF(20, 25, 30)
end
service == poor || food == rancid --> tip == cheap
service == good --> tip == average
service == excellent || food == delicious --> tip == generous
defuzzifier = KarnikMendelDefuzzifier()
end
plot(fis)
fis(service = 2, food = 3)
1-element Dictionaries.Dictionary{Symbol, Float64}
:tip │ 7.500432748035022