pyinference.fuzzy package

Submodules

pyinference.fuzzy.domain module

Модуль, описывающий различные типы носителей нечетких множеств, а также реализующий функциональность нечетких правил логического вывода.

class pyinference.fuzzy.domain.Domain[source]

Bases: object

Абстрактный класс, реализующий интерфейс носителя нечеткого множества.

Смысловую нагрузку несут подклассы этого класса, представляющие различные виды носителей. Преимуществом такого подхода является его универсальность: в качестве носителя при определении нечеткого множества можно задавать действительный интервал, целочисленный интервал, в принципе, любую итерируемую структуру.

card()[source]

Cardinality of the domain

char()[source]
class pyinference.fuzzy.domain.IntegerRange(begin=1, end=100)[source]

Bases: pyinference.fuzzy.domain.RationalRange

Класс, моделирующий носитель нечеткого множества в виде целочисленного интервала.

По сути, является частным случаем предыдущего класса (см. RationalRange), когда точность равна разнице границ интервала.

Синтаксис:

>>> B=IntegerRange(begin=0.0, end=3.0)
>>> for i in B: print i
0
1
2
3
Attributes:
begin end
class pyinference.fuzzy.domain.RationalRange(begin=0.0, end=1.0, acc=1000)[source]

Bases: pyinference.fuzzy.domain.Domain

Данный класс реализует носитель нечеткого подмножества в виде отрезка действительной оси.

В качестве параметров конструктор класса принимает значения начала и конца интервала, а также параметр “точность” - целое число, определяющее количество проходов при расчете нечетких функционалов численным методом. Это число является компромиссом между точностью и скоростью подсчета, поэтому там, где это возможно, численный расчет нечетких функционалов заменен аналитическими выражениями.

Синтаксис:

>>> B = RationalRange(end=3.0, acc=3)
>>> for i in B: print i
0.0
1.0
2.0
3.0
>>> B = RationalRange(end=3.0, acc=8)
>>> for i in B: print i
0.0
0.375
0.75
1.125
1.5
1.875
2.25
2.625
3.0
Attributes:
begin: end: acc:
card()[source]

pyinference.fuzzy.set module

Модуль для работы с нечеткими множествами.

Модуль реализует функциональность аппарата нечеткой логики в части работы с нечеткими множествами. Он включает:

  • абстрактный класс нечеткого множества,
  • шаблоны для создания классификаторов различных видов.

В основном, модуль предназначен длясоздания и спользования нечетких классификаторов. С помощью него можно создать классификатор как в ручном режиме и заполнить его термами самостоятельно, так и воспользоваться одним из конструкторов, описанных ниже.

Нечеткий классификатор - это одно из применений нечеткого множества. Он состоит из нескольких нечетких подмножеств (см. pyinference.fuzzy.subset.FuzzySubset), определенных на одном носителе (интервале определения). Термы множества имеют метки,которые используются в качестве значений лингвистических переменных вместо обычных чисел.

class pyinference.fuzzy.set.FuzzySet(begin=0.0, end=1.0, domain=None, name='')[source]

Bases: object

Нечеткое множество.

Нечеткое множество, или классификатор, состоящее из набора нечетких подмножеств, определенных на одном и том же носителе.

Синтаксис:
>>> A = FuzzySet(0, 100, name='Classifier')
>>> A.domain.begin
0.0
>>> A.domain.end
100.0
>>> A.name
'Classifier'
>>> A.sets
{}
Поля класса:
sets (dict): Ассоциативный массив, содержащий, соответственно, имя и объект типа
pyinference.fuzzy.subset.Subset, для каждого терма нечеткого множества.

domain (pyinference.fuzzy.domain.Domain): носитель нечеткого множества

name (str): имя классификатора

Именованные параметры:

begin (float): начало интервала определения классификатора

end (float): конец интервала определения классификатора

name (str): имя классификатора

domain (pyinference.fuzzy.domain.Domain): носитель нечеткого множества

add_term(sub, name='')[source]

Добавляет терм к данному классификатору. Порядок термов не важен.

Syntax:
>>> A = FuzzySet(0, 100)
>>> S = Gaussian(20, 10)
>>> A.add_term(S, name = 'term1')
>>> A.sets['term1'].median
20.0
>>> A.add_term(Triangle(30, 50, 75), name = 'term2')
>>> A.sets['term2'].mode()
50.0
Параметры:
sub: нечеткое подмножество типа Subset, или любого производного,
играющее роль терма нечеткого множества (классификатора)
Именованные параметры:
name: cтрока, идентифицирующая терм в составе данного множества.
Используется для построении легенды в методе plot(), а также как ключ ассоциативного массива Sets
classify(val)[source]

Возвращает имя терма, наиболее соответствующего переданному элементу.

Будучи вызванным у квалификатора, соответствует квалификации точного значения или значения, выраженного нечетким подмножеством или числом.

Синтаксис:
>>> from pyinference.fuzzy.subset import Gaussian, Triangle
>>> A = FuzzySet(0, 100, name='Classifier')
>>> A.add_term(Gaussian(20, 10), name='term1')
>>> A.add_term(Triangle(30, 50, 75), name='term2')
>>> A.classify(15)
'term1'
>>> A.classify(55)
'term2'
>>> A.classify(40)
'term2'
Параметры:
val (float or object): элемент области определения нечеткого множества.
Возвращает:
Имя классификатора, наиболее соответствующего данной точке.
find(val, term)[source]

Возвращает значение принадлежности точки x терму term.

Синтаксис:
>>> C  =  Partition(peaks=[0.0, 0.3, 1.0])
>>> C.find(0, '0')
1.0
>>> '%0.3f' % C.find(0.12, '0')
'0.600'
>>> C.find(0.12, '1')
0.4
>>> C.find(0.12, '2')
0.0
>>> C.find(0.5, '0')
0.0
>>> round(C.find(0.65, '1'), 3)
0.5
>>> round(C.find(0.65, '2'), 3)
0.5
Параметры:

val (float or object): элемент области определения нечеткого множества

term (str): имя терма;

Возвращает:
Число, соответствующее принадлежности данной точке области определения (val) данному терму классифиактора (term).
has_key()[source]
items()[source]
iteritems()[source]
iterkeys()[source]
itervalues()[source]
keys()[source]
plot(verbose=False, subplot=<module 'pylab' from '/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.1-py2.7-linux-i686.egg/pylab.pyc'>)[source]

Отображает нечеткое множество графически. Все термы представляются на одном графике.

Синтаксис:
>>> C  =  Partition(peaks=[0.0, 0.3, 1.0])
>>> C.plot()
Именованные параметры:

verbose (bool): задает подробное указание критических точек подмножеств на графике;

subplot (pylab.plot): если требуется отобразить данное множество на подграфике,
можно воспользоваться данным параметром.
values()[source]
class pyinference.fuzzy.set.GaussianClassifier(begin=0.0, end=1.0, domain=None, name='', names=None, edge=0, cross=1.0)[source]

Bases: pyinference.fuzzy.set.FuzzySet

Равномерный классификатор с термами в виде гауссиан.

Синтаксис:
>>> A = GaussianClassifier(names=['low', 'middle', 'high'])
>>> A  =  GaussianClassifier(names = ['low', 'middle', 'high'])
>>> print A.domain.begin
0.0
>>> print A.domain.end
1.0
>>> print A['low'].mode()
0.0
>>> print A['middle'].mode()
0.5
>>> print A['high'].mode()
1.0

Параметры конструктора (см. pyinference.fuzzy.set.FuzzySet, pyinference.fuzzy.set.TriangleClassifier).

..note::
Так как гауссиана не ограничена по области определения, параметр cross конструктора данного класса ограничивает область в три сигмы.
class pyinference.fuzzy.set.Partition(begin=0.0, end=1.0, domain=None, peaks=None, overlap=1.0, name='')[source]

Bases: pyinference.fuzzy.set.FuzzySet

Данный класс создает линейный неравномерный классификатор по точкам, указанным в параметрах.

Характерной особенностью данного классификатора являтеся то, что для каждого элемента носителя сумма принадлежностей всех термов равна 1,0. Классификатор строится на действительном интервале. Термы классификатора именуются арабскими числами, начиная с 1.

Синтаксис:
>>> Clas = Partition(peaks=[0.0, 0.1, 0.3, 0.4, 0.6, 1.0], overlap=0.2)
>>> A = Partition(begin=10, end=20, peaks=[10, 13, 18, 20], overlap=1.0, name='sample classifier')
>>> A['1'].mom()
13.0
>>> A = Partition(begin=10, end=20, peaks=[10, 13, 18, 20], overlap=0.2, name='sample classifier')
>>> '%0.3f' % A['1'].mom()
'13.430'
>>> A.classify(14)
'1'
>>> A.classify(17)
'2'
>>> A  =  Partition(begin = 10, end = 20, peaks = [10, 13, 15, 20], overlap = 0.2, name = 'sample classifier')
>>> A.domain.begin
10.0
>>> A.domain.end
20.0
>>> A.name
'sample classifier'
>>> A.sets.keys()
['1', '0', '3', '2']
>>> A['0'].mode()
10.0
>>> A['0'].domain.begin
10.0
>>> '%0.3f' % A['0'].domain.end
'11.710'
>>> '%0.3f' % A['1'].mode()
'11.710'
>>> '%0.3f' % A['1'].domain.begin
'11.290'
>>> '%0.3f' % A['1'].domain.end
'14.140'
Параметры:

name (str): имя классификатора

begin (float): начало области определения

end (float): конец области определения

domain (pyinference.fuzzy.domain.Domain): носитель нечеткого множества

peaks (list): массив чисел, представляющих центры интервалов толерантности термов

overlap (float): параметр, задающий крутизну скатов ФП термов и ширину интервала
толерантности. При overlap = 0 классификатор становится четким, при overlap = 1 ФП термов становятся треугольными.
class pyinference.fuzzy.set.TriangleClassifier(begin=0.0, end=1.0, domain=None, name='', names=None, edge=False, cross=1.0)[source]

Bases: pyinference.fuzzy.set.FuzzySet

Равномерный классификатор с термами в виде равноскатных треугольных чисел.

Синтаксис:
>>> A = TriangleClassifier(names=['low', 'middle', 'high'])
>>> A  =  TriangleClassifier(begin = 0, end = 100,
...                             name = 'Sample classifier',
...                             names = ['low', 'middle', 'high'],
...                             edge = True, cross = 2)
>>> print A.domain.begin
0.0
>>> print A.domain.end
100.0
>>> print A['low']
25.0
>>> print A['low'].mode()
25.0
>>> print A['middle'].mode()
50.0
>>> print A['high'].mode()
75.0
>>> A  =  TriangleClassifier(names = ['low', 'middle', 'high'])
>>> print A.domain.begin
0.0
>>> print A.domain.end
1.0
>>> print A['low'].mode()
0.0
>>> print A['middle'].mode()
0.5
>>> print A['high'].mode()
1.0
Параметры конструктора:
names (list): список строк, каждая из которых представляет собой имя терма,
входящего в данный классификатор. Порядок термов соблюдается.
edge (bool): параметр, задающий расположение термов.

Если edge = False (по умолчанию), то первый и последний термы будут иметь вершины в точках, соответственно, начала и конца интервала определения классификатора:

>>> names = ['1', '2', '3']
>>> A = TriangleClassifier(names = names, edge = False)
>>> A.sets['1'].mode()
0.0
>>> A.sets['2'].mode()
0.5
>>> A.sets['3'].mode()
1.0

Если edge = True, то первый и последний термы будут иметь отступ от границ интервала определения, равный отступу между термами:

>>> A = TriangleClassifier(names = names, edge = True)
>>> '%0.3f' % A.sets['1'].mode()
'0.167'
>>> '%0.3f' % A.sets['2'].mode()
'0.500'
>>> '%0.3f' % A.sets['3'].mode()
'0.833'
cross: Параметр задает степень пересечения термов классификатора.

Может принимать значения от 0 до бесконечности. При cross = 1 (по умолчанию) каждый объект области определения принадлежит только одному множеству. Функции принадлежности соседних термов расположены “впритык”.

>>> A = TriangleClassifier(names = names)
>>> A.sets['1'].domain.end
0.25
>>> A.sets['2'].domain.begin
0.25
>>> A.sets['2'].domain.end
0.75
>>> A.sets['3'].domain.begin
0.75

При cross = 2 функции принадлежности строятся таким образом, что каждый терм покрывает ровно половину ширины соседних термов. Таким образом, каждая точка области определения принадлежит двум нечетким подмножествам.

>>> A = TriangleClassifier(names = names, cross = 2.0)
>>> A.sets['1'].domain.end
0.5
>>> A.sets['2'].mode()
0.5
>>> A.sets['2'].domain.end
1.0
>>> A.sets['3'].domain.begin
0.5
>>> A.sets['3'].mode()
1.0

При 0 < cross < 1 между термами классификатора появляются интервалы, значения в которых не принадлежат ни одному терму. При cross = 0 термы вырождаются в точку.

pyinference.fuzzy.subset module

Модуль реализует набор базовых типов, представляющих разные виды нечетких подмножеств.

class pyinference.fuzzy.subset.Algebra[source]
class pyinference.fuzzy.subset.Gaussian(mu, omega)[source]

Bases: pyinference.fuzzy.subset.Subset

Определяет нечеткое множество с функцией принадлежности в виде гауссианы. Синтаксис:

>>> A=Gaussian(0.0, 1.0)    # Стандартное распределение

Первый параметр - мода гауссианы, второй - стандартное отклонение (омега) Attributes:

mu omega
card()[source]
centr()[source]
mode()[source]
plot(verbose=True, subplot=<module 'pylab' from '/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.1-py2.7-linux-i686.egg/pylab.pyc'>)[source]
value(x)[source]
class pyinference.fuzzy.subset.Interval(a, b, x=1.0)[source]

Bases: pyinference.fuzzy.subset.Trapezoidal

Определяет четкий интервал как частный вид нечеткого множества. Конструктор принимает два параметра - границы интервала. Синтаксис:

>>> A=Interval(0.5, 6.4)
card()[source]
value(value)[source]
class pyinference.fuzzy.subset.NumbersAlgebra[source]

Bases: pyinference.fuzzy.subset.Algebra

class pyinference.fuzzy.subset.Point(a)[source]

Bases: pyinference.fuzzy.subset.Trapezoidal

Реализует нечеткое множество состоящее из одной точки. Синтаксис:

>>> A=Point(2.0)
card()[source]
plot(verbose=True, subplot=<module 'pylab' from '/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.1-py2.7-linux-i686.egg/pylab.pyc'>)[source]
value(x)[source]
class pyinference.fuzzy.subset.Subset(begin=0.0, end=1.0, domain=None)[source]

Bases: object

Нечеткое подмножество.

Реализует функциональность нечеткого подмножества общего вида. Имеет атрибуты, указывающие начало и конец интервала определения подмножества (для подмножеств, определенных на R).

Syntax:
>>> A = Subset()
>>> A.domain.begin
0.0
>>> A.domain.end
1.0
Attributes:

values (dict):

points (dict):

domain (pyinference.fuzzy.domain.Domain):

Kwargs:

begin (float):

end (float):

begin (pyinference.fuzzy.domain.Domain):

card()[source]

Возвращает мощность нечеткого подмножества Синтаксис:

>>> T=Triangle(-1.4, 0.0, 2.6)
>>> print round(T.card(), 2) 
4.0
centr()[source]

Вычисляет центроид (центр масс) нечеткого подмножества. Зависит от конфигурации ФП. Работает как на непрерывных ФП заданного вида, так и на ФП произвольного вида. >>> A=Triangle(0.2, 0.3, 0.4) >>> print round(A.centr(), 3) 0.3 >>> A=Trapezoidal((1.0, 2.0, 5.0, 6.0)) >>> “%0.2f” % A.centr() ‘3.50’

char()[source]

Выводит на экран список элементов носителя и соответствующих им значений нечеткого множества. Шаг перебора непрерывного носителя совпадает с частотой дискретизации при численных вычислениях Синтаксис:

>>> A = Triangle(1.0, 2.0, 4.0)
>>> A.domain.acc=5
>>> A.char()
1.0 0.0
1.6 0.6
2.2 0.9
2.8 0.6
3.4 0.3
4.0 0.0
euclid_distance(other)[source]
hamming_distance(other)[source]
level(lvl)[source]
mode()[source]

Возвращает моду (точку максимума) нечеткого подмножества.

Синтаксис:
>>> A = Triangle(10, 20, 40)
>>> A.mode()
20.0
>>> B = Triangle(20, 40, 50)
>>> B.mode()
40.0
>>> C = A + B
>>> '%0.3f' % C.mode()
'20.040'
normalize()[source]

Возвращает нормированное по высоте нечеткое множество. Синтаксис:

>>> A = Triangle(1.0, 2.0, 4.0)
>>> A.domain.acc=5
>>> B = A*0.5
>>> '%0.3f' % B.card()
'0.720'
>>> '%0.3f' % A.card()
'1.500'
>>> C = B.normalize()
>>> '%0.3f' % C.card()
'1.600'
>>> '%0.3f' % B.value(B.mode())
'0.450'
>>> '%0.3f' % C.value(C.mode())
'1.000'
plot(verbose=True, subplot=<module 'pylab' from '/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.1-py2.7-linux-i686.egg/pylab.pyc'>)[source]

Отображает нечеткое множество графически. Только для нечетких множеств, определенных на носителе типа RationalRange. Параметр verbose определяет отображение на графике дополнительной информации. Синтаксис:

>>> A=Triangle(2.5, 3.8, 10.2)
>>> A.plot()
>>> A.plot()
>>> A.plot(verbose=False)
sup()[source]
value(key)[source]

Возвращает уровень принадлежности точки нечеткому подмножеству. Данный метод непосредственно и является программной имплементацией функции принадлежности. >>> A = Gaussian(1.0, 1.0) >>> A.value(0.5) 0.8825 >>> A.value(1.5) 0.8825 >>> A.value(1.0) 1.0 >>> A.value(0.0) 0.60653

class pyinference.fuzzy.subset.SubsetAlgebra(tnorm=None)[source]

Bases: pyinference.fuzzy.subset.Algebra

class pyinference.fuzzy.subset.Trapezoidal(points)[source]

Bases: pyinference.fuzzy.subset.Subset

Нечеткое множество с трапециевидной функцией принадлежности. Синтаксис:

>>> A = Trapezoidal((0.0, 1.5, 2.8, 6.6))
Параметры:
begin
задает нижнюю границу левого ската трапеции. Значение принадлежности в этой точке равно 0.
begin_tol
задает нижнюю границу интервала толернтности. Значение принадлежности равно 1.
end_tol
верхняя граница интервала толерантности. Значение - 1.
end
верхняя граница правого ската трапеции. Значение - 0.
domain
Этим параметром можно задать границы области определения нечеткого множества. Подробнее см. RationalRange и IntegerRange.
Attributes:
begin_tol end_tol
card()[source]
median()[source]
mode()[source]
mom()[source]
class pyinference.fuzzy.subset.Triangle(a, b, c)[source]

Bases: pyinference.fuzzy.subset.Trapezoidal

Нечеткое множество с функцией принадлежности в виде треугольника. Фактически, представляет собой частный случай трапециевидного нечеткого множества с вырожденным в точку интервалом толерантности. Этот класс создан для быстрого создания нечетких множеств наиболее распространенной (треугольной) формы. Синтаксис:

>>> A=Triangle(1.0, 2.3, 5.6)
Параметры:
Принимает три параметра, по порядку: нижняя раница ската, точка моды, верхняя граница ската. Числа должны быть упорядочены по возрастанию.
Attributes:
a b c
card()[source]
mode()[source]

pyinference.fuzzy.tnorm module

Модуль реализует набор простых и параметрических треугольных норм и конорм.

class pyinference.fuzzy.tnorm.Drastic[source]

Bases: pyinference.fuzzy.tnorm.Tnorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Margin[source]

Bases: pyinference.fuzzy.tnorm.Tnorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.MinMax[source]

Bases: pyinference.fuzzy.tnorm.Tnorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.ParametricNorm(param)[source]

Bases: pyinference.fuzzy.tnorm.Tnorm

class pyinference.fuzzy.tnorm.SumProd[source]

Bases: pyinference.fuzzy.tnorm.Tnorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm[source]

Bases: object

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm1(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm2(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm3(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm4(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm5(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm6(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]
class pyinference.fuzzy.tnorm.Tnorm7(param)[source]

Bases: pyinference.fuzzy.tnorm.ParametricNorm

conorm(i, j)[source]
norm(i, j)[source]

Module contents

Библиотека работы с аппаратом нечеткой логики

Данная библиотека содержит ряд модулей, призванных обеспечить использование нечеткой логики в экономико-математическом моделировании. Она включает следующие разделы:

  • различные носители нечетких подмножеств: от действительного интервала до

иерархических структур

  • нечеткие подмножества: арифметические, логические операции
  • нечеткие числа, нечеткая арифметика
  • нечеткие множества, классификаторы
  • нечеткий логический вывод, нечеткие контроллеры
  • метод анализа иерархий