Pull to refresh

Прямой нечеткий логический вывод

Reading time 5 min
Views 18K

Введение


В 1965 г. в журнале «Information and Control» была опубликована работа Л.Заде под названием «Fuzzy sets». Это название переведено на русский язык как нечеткие множества. Побудительным мотивом стала необходимость описания таких явлений и понятий, которые имеют многозначным и неточный характер. Известные до этого математические методы, использовавшие классическую теорию множеств и двузначную логику, не позволяли решать проблемы этого типа.



При помощи нечетких множеств можно формально определить неточные и многозначные понятия, такие как «высокая температура» или «большой город». Для формулирования определения нечеткого множества необходимо задать так называемую област рассуждений. Например, когда мы оцениваем скорость автомобиля, мы ограничимся диапазоном X = [0, Vmax], где Vmax — максимальная скорость, которую может развить автомобиль. Необходимо помнить, что X — четкое множество.

Основные понятия


Нечетким множеством A в некотором непустом пространстве X называется множество пар

где

— функция принадлежности нечеткого множества A. Эта функция приписывает каждому элементу x степень его принадлежности нечеткому множеству A.

Продолжив предыдущий пример, рассмотрим три неточные формулировки:
— «Малая скорость автомобиля»;
— «Средняя скорость автомобиля»;
— «Большая скорость автомобиля».
На рисунке представлены нечеткие множества, соответствующие приведенным формулировкам, с помощью функций принадлежности.

В фиксированной точке X=40км/ч. функция принадлежности нечеткого множества «малая скорость автомобиля» принимает значением 0,5. Такое же значение принимает функция принадлежностинечеткого множества «средняя скорость автомобиля», тогда как для множества «большая скорость автомобиля» значение функции в этой точке равно 0.

Функция T двух переменных T: [0, 1] x [0, 1] -> [0, 1] называется T-нормой, если:
— является не возрастающей относительно обоих аргументов: T(a, c) < T(b, d) для a < b, c < d;
— является коммутативной: T(a, b) = T(b, a);
— удовлетворяет условию связности: T(T(a, b), c) = T(a, T(b, c));
— удовлетворяет граничным условиям: T(a, 0) = 0, T(a, 1) = a.

Прямой нечеткий вывод


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

Основным правилом вывода в традиционной логике является правило modus ponens, согласно которому мы судим об истинности высказывания B по истинности высказываний A и A -> B. Например, если A — высказывание «Степан — космонавт», B — высказывание «Степан летает в космос», то если истинны высказывания «Степан — космонавт» и «Если Степан — космнавт, то он летает в космос», то истинно и высказывание «Степан летает в космос».

Однако, в отличие от традиционной логики, главным инструментом нечеткой логики будет не правило modus ponens, а так называемое композиционное правило вывода, весьма частным случаем которого является правило modus ponens.

Предположим, что имеется кривая y=f(x) и задано значение x=a. Тогда из того, что y=f(x) и x=a, мы можем заключить, что y=b=f(a).

Обобщим теперь этот процесс, предположив, что a — интервал, а f(x) — функция, значения которой суть интервалы. В этом случае, чтобы найти интервал y=b, соответствующий интервалу a, мы сначала построим множество a' с основанием a и найдем его пересечение I с кривой, значения которой суть интервалы. Затем спроектируем это пересечение на ось OY и получим желаемое значение y в виде интервала b. Таким образом, из того, что y=f(x) и x=A — нечеткое подмножество оси OX, мы получаем значение y в виде нечеткого подмножества B оси OY.

Пусть U и V — два универсальных множества с базовыми переменными u и v, соответственно. Пусть A и F — нечеткие подмножества множеств U и U x V. Тогда композиционное правило вывода утверждает, что из нечетких множеств A и F следует нечеткое множество B = A * F.

Пусть A и B — нечеткие высказывания и m(A), m(B) — соответствующие им функции принадлежности. Тогда импликации A -> B будет соответствовать некоторая функция принадлежности m(A -> B). По аналогии с традиционной логикой, можно предположить, что

Тогда

Однако, это не единственное обобщение оператора импликации, существуют и другие.

Реализация


Для реализации метода прямого нечеткого логического вывода нам понадобится выбрать оператор импликации и T-норму.
Пуская T-норма будет функция минимума:
  1. def t_norm(v1, v2):
  2.     return min(v1, v2)

а оператором импликации будет функция Гёделя:

  1. def impl(v1, v2):
  2.     '''<br/>    Godel implication<br/>    '''
  3.     if v1 <= v2:
  4.         return 1.0
  5.     else:
  6.         return v2

Входные данные будут содержать знания (нечеткие множества) и правила (импликации), например:
A = {(x1, 0.0), (x2, 0.2), (x3, 0.7), (x4, 1.0)}.
B = {(x1, 0.7), (x2, 0.4), (x3, 1.0), (x4, 0.1)}.
A => B.

Импликация будет представлена в виде декартовой матрицы, каждый элемент которой рассчитывается с помощью выбранного оператора импликации (в данном примере — функции Гёделя):
  1. def compute_impl(set1, set2):
  2.     '''<br/>    Computing implication<br/>    '''
  3.     relation = {}
  4.     for i in set1.items():
  5.         relation[i] = {}
  6.         for j in set2.items():
  7.             v1 = set1.value(i)
  8.             v2 = set2.value(j)
  9.             relation[i][j] = impl(v1, v2)
  10.     return relation

Для данных выше это будет:
Conclusion:
A => B.
    x1  x2  x3  x4
x1 1.0 1.0 1.0 1.0
x2 1.0 1.0 1.0 0.1
x3 1.0 0.4 1.0 0.1
x4 0.7 0.4 1.0 0.1

Далее в результате вывода получается новое множество:
  1. def conclusion(set, relation):
  2.     '''<br/>    Conclusion  <br/>    '''
  3.     conl_set = []
  4.     for i in relation:
  5.         l = []
  6.         for j in relation[i]:
  7.             v_set = set.value(i)
  8.             v_impl = relation[i][j]
  9.             l.append(t_norm(v_set, v_impl))
  10.         value = max(l)
  11.         conl_set.append((i, value))
  12.     return conl_set

Результат:
B' = {(x1, 1.0), (x2, 0.7), (x3, 1.0), (x4, 0.7)}.

Источники


  • Рутковская Д., Пилиньский М., Рутковский Л. Нейронные сети, генетические алгоритмы и нечеткие системы: Пер. с польск. И. Д. Рудинского. — М.: Горячая линия — Телеком, 2006. — 452 с.: ил.
  • Zadeh L. A. Fuzzy Sets, Information and Control, 1965, vol. 8, s. 338-353
Tags:
Hubs:
+37
Comments 15
Comments Comments 15

Articles