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.

Try it yourself!

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