Модуль, описывающий различные типы носителей нечетких множеств, а также реализующий функциональность нечетких правил логического вывода.
Bases: object
Абстрактный класс, реализующий интерфейс носителя нечеткого множества.
Смысловую нагрузку несут подклассы этого класса, представляющие различные виды носителей. Преимуществом такого подхода является его универсальность: в качестве носителя при определении нечеткого множества можно задавать действительный интервал, целочисленный интервал, в принципе, любую итерируемую структуру.
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
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
Модуль для работы с нечеткими множествами.
Модуль реализует функциональность аппарата нечеткой логики в части работы с нечеткими множествами. Он включает:
- абстрактный класс нечеткого множества,
- шаблоны для создания классификаторов различных видов.
В основном, модуль предназначен длясоздания и спользования нечетких классификаторов. С помощью него можно создать классификатор как в ручном режиме и заполнить его термами самостоятельно, так и воспользоваться одним из конструкторов, описанных ниже.
Нечеткий классификатор - это одно из применений нечеткого множества. Он состоит из нескольких нечетких подмножеств (см. pyinference.fuzzy.subset.FuzzySubset), определенных на одном носителе (интервале определения). Термы множества имеют метки,которые используются в качестве значений лингвистических переменных вместо обычных чисел.
Bases: object
Нечеткое множество.
Нечеткое множество, или классификатор, состоящее из набора нечетких подмножеств, определенных на одном и том же носителе.
>>> A = FuzzySet(0, 100, name='Classifier')
>>> A.domain.begin
0.0
>>> A.domain.end
100.0
>>> A.name
'Classifier'
>>> A.sets
{}
domain (pyinference.fuzzy.domain.Domain): носитель нечеткого множества
name (str): имя классификатора
begin (float): начало интервала определения классификатора
end (float): конец интервала определения классификатора
name (str): имя классификатора
domain (pyinference.fuzzy.domain.Domain): носитель нечеткого множества
Добавляет терм к данному классификатору. Порядок термов не важен.
>>> 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
Возвращает имя терма, наиболее соответствующего переданному элементу.
Будучи вызванным у квалификатора, соответствует квалификации точного значения или значения, выраженного нечетким подмножеством или числом.
>>> 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'
Возвращает значение принадлежности точки 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): имя терма;
Отображает нечеткое множество графически. Все термы представляются на одном графике.
>>> C = Partition(peaks=[0.0, 0.3, 1.0])
>>> C.plot()
verbose (bool): задает подробное указание критических точек подмножеств на графике;
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).
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): массив чисел, представляющих центры интервалов толерантности термов
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
Если 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'
Может принимать значения от 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 термы вырождаются в точку.
Модуль реализует набор базовых типов, представляющих разные виды нечетких подмножеств.
Bases: pyinference.fuzzy.subset.Subset
Определяет нечеткое множество с функцией принадлежности в виде гауссианы. Синтаксис:
>>> A=Gaussian(0.0, 1.0) # Стандартное распределение
Первый параметр - мода гауссианы, второй - стандартное отклонение (омега) Attributes:
mu omega
Bases: pyinference.fuzzy.subset.Trapezoidal
Определяет четкий интервал как частный вид нечеткого множества. Конструктор принимает два параметра - границы интервала. Синтаксис:
>>> A=Interval(0.5, 6.4)
Bases: pyinference.fuzzy.subset.Trapezoidal
Реализует нечеткое множество состоящее из одной точки. Синтаксис:
>>> A=Point(2.0)
Bases: object
Нечеткое подмножество.
Реализует функциональность нечеткого подмножества общего вида. Имеет атрибуты, указывающие начало и конец интервала определения подмножества (для подмножеств, определенных на R).
>>> A = Subset()
>>> A.domain.begin
0.0
>>> A.domain.end
1.0
values (dict):
points (dict):
domain (pyinference.fuzzy.domain.Domain):
begin (float):
end (float):
begin (pyinference.fuzzy.domain.Domain):
Возвращает мощность нечеткого подмножества Синтаксис:
>>> T=Triangle(-1.4, 0.0, 2.6)
>>> print round(T.card(), 2)
4.0
Вычисляет центроид (центр масс) нечеткого подмножества. Зависит от конфигурации ФП. Работает как на непрерывных ФП заданного вида, так и на ФП произвольного вида. >>> 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’
Выводит на экран список элементов носителя и соответствующих им значений нечеткого множества. Шаг перебора непрерывного носителя совпадает с частотой дискретизации при численных вычислениях Синтаксис:
>>> 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
Возвращает моду (точку максимума) нечеткого подмножества.
>>> 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'
Возвращает нормированное по высоте нечеткое множество. Синтаксис:
>>> 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'
Отображает нечеткое множество графически. Только для нечетких множеств, определенных на носителе типа RationalRange. Параметр verbose определяет отображение на графике дополнительной информации. Синтаксис:
>>> A=Triangle(2.5, 3.8, 10.2)
>>> A.plot()
>>> A.plot()
>>> A.plot(verbose=False)
Bases: pyinference.fuzzy.subset.Subset
Нечеткое множество с трапециевидной функцией принадлежности. Синтаксис:
>>> A = Trapezoidal((0.0, 1.5, 2.8, 6.6))
Bases: pyinference.fuzzy.subset.Trapezoidal
Нечеткое множество с функцией принадлежности в виде треугольника. Фактически, представляет собой частный случай трапециевидного нечеткого множества с вырожденным в точку интервалом толерантности. Этот класс создан для быстрого создания нечетких множеств наиболее распространенной (треугольной) формы. Синтаксис:
>>> A=Triangle(1.0, 2.3, 5.6)
Модуль реализует набор простых и параметрических треугольных норм и конорм.
Библиотека работы с аппаратом нечеткой логики
Данная библиотека содержит ряд модулей, призванных обеспечить использование нечеткой логики в экономико-математическом моделировании. Она включает следующие разделы:
- различные носители нечетких подмножеств: от действительного интервала до
иерархических структур
- нечеткие подмножества: арифметические, логические операции
- нечеткие числа, нечеткая арифметика
- нечеткие множества, классификаторы
- нечеткий логический вывод, нечеткие контроллеры
- метод анализа иерархий