Нечеткая логика — математические основы. Понятие нечеткой логики

Основы теории нечетких множеств и нечеткой логики

Одним из методов изучения множеств без уточнения их границ является теория нечетких множеств, которая была предложена в 1965 г. профессором Калифорнийского университета Лотфи Заде. Первоначально она разрабатывалась как средство моделирования неопределенности естественного языка. Однако впоследствии круг задач, решаемых с использованием аппарата нечетких множеств, значительно расширился и сейчас включает в себя такие области, как анализ данных, распознавание, исследование операций, моделирование сложных систем, поддержка принятия решений и т. д. .

Нередко при определении и описании характеристик объектов оперируют не только количественными, но и качественными значениями. В частности, рост человека можно количественно измерить в сантиметрах, а можно описать, используя качественные значения: карликовый, низкий, средний, высокий или гигантский. Интерпретация качественных значений носит субъективный характер, т.е. они могут по-разному трактоваться разными людьми (субъектами). В силу нечеткости (размытости) качественных значений, при необходимости перехода от них к количественным величинам возникают определенные трудности.

В системах, построенных на базе нечетких множеств, используются правила вида «ЕСЛИ А ТО В» (А ® В), в которых как в А (условие, предпосылку), так и в В (результат, гипотезу) могут входить качественные значения. Например, «ЕСЛИ Рост = "высокий" ТО Вид_спорта = "баскетбол"».

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

Каждое значение лингвистической переменной определяется через так называемое нечеткое множество. Нечеткое множество определяется через некоторую базовую шкалу X и функцию принадлежности (характеристическую функцию) m(х ), где х Î Х . При этом, если в классическом канторовском множестве элемент либо принадлежит множеству (m(х ) = 1), либо не принадлежит (m(х ) = 0), то в теории нечетких множеств m(х ) может принимать любое значение в интервале . Над нечеткими множествами можно выполнять стандартные операции: дополнение (отрицание), объединение, пересечение, разность и т. д. (рис. 33).

Для нечетких множеств существует также ряд специальных операций: сложение, умножение, концентрирование, расширение и т. д.

При задании лингвистической переменной ее значения, т. е. нечеткие множества, должны удовлетворять определенным требованиям (рис. 34).

1. Упорядоченность. Нечеткие множества должны быть упорядочены (располагаться по базовой шкале) в соответствии с порядком задания качественных значений для лингвистической переменной.

2. Ограниченность. Область определения лингвистической переменной должна быть четко обозначена (определены минимальные и максимальные значения лингвистической переменной на базовой шкале). На границах универсального множества, где определена лингвистическая переменная, значения функций принадлежности ее минимального и максимального нечеткого множества должны быть единичными. На рисунке Т 1 имеет неправильную функцию принадлежности, а Т 6 – правильную.

3. Согласованность. Должно соблюдаться естественное разграничение понятий (значений лингвистической переменной), когда одна и та же точка универсального множества не может одновременно принадлежать с m(х ) = 1 двум и более нечетким множествам (требование нарушается парой Т 2 – Т 3).

4. Полнота. Каждое значение из области определения лингвистической переменной должно описываться хотя бы одним нечетким множеством (требование нарушается между парой T 3 – Т 4).

5. Нормальность. Каждое понятие в лингвистической переменной должно иметь хотя бы один эталонный или типичный объект, т. е. в какой-либо точке функция принадлежности нечеткого множества должна быть единичной (требование нарушается T 5).

X

Нечеткое множество «низкий рост» m н (х )

0 20 40 60 80 100 110 120 140 160 X

Нечеткое множество «высокий рост» m в (х )

0 20 40 60 80 100 110 120 140 160 X

Д = Н: Дополнение нечеткого множества «низкий рост»

m д (х ) = 1 – m н (х )

0 20 40 60 80 100 110 120 140 160 X

Н È В: Объединение нечетких множеств «низкий рост» и «высокий рост»

m нв (х ) = mах (m н (х ), m в (х ))

0 20 40 60 80 100 110 120 140 160 X

Н Ç В: Пересечение нечетких множеств «низкий рост» и «высокий рост»

m нв (х ) = min (m н (х ), m в (х ))

Рис. 33. Операции над нечеткими множествами

m(х ) Т 1 Т 2 Т 3 Т 4 Т 5 Т 6

Рис. 34. Пример задания нечетких множеств для линг­вис­тической переменной с нарушением требований

Требования 2–4 можно заменить одним универсальным – сумма функций принадлежности m(х ) по всем нечетким множествам в каждой точке области определения переменной должна равняться 1.

При обработке правил с лингвистическими переменными (нечетких правил) для вычисления истинности гипотезы применяются правила нечеткой логики. Нечеткая логика – разновидность непрерывной логики, в которой предпосылки, гипотезы и сами логические формулы могут принимать истинностные значения с некоторой долей вероятности.

Основные положения нечеткой логики:

· истинность предпосылки, гипотезы или формулы лежит в интервале ;

· если две предпосылки (Е 1 и Е 2) соединены Ù (логическим И), то истинность гипотезы Н рассчитывается по формуле t(Н) = MIN(t(Е 1), t(Е 2));

· если две предпосылки (Е 1 и Е 2) соединены Ú (логическим ИЛИ), то истинность гипотезы Н рассчитывается по формуле t(Н) = MAX(t(Е 1), t(Е 2));

· если правило (П) имеет свою оценку истинности, тогда итоговая истинность гипотезы Н итог корректируется с учетом истинности правила t(Н итог) = MIN(t(Н), t(П)).

Стандартная статья о нечеткой логике обычно грешит двумя вещами:

  1. В 99% случаев статья касается исключительно применения нечеткой логики в контексте нечетких множеств, а точнее нечеткого вывода, а еще точнее алгоритма Мамдани. Складывается впечатление, что только этим способом нечеткая логика может быть применена, однако это не так.
  2. Почти всегда статья написана на математическом языке. Замечательно, но программисты пользуются другим языком с другими обозначениями. Поэтому оказывается, что статья просто непонятна тем, кому, казалось бы, должна быть полезна.
Все это грустно, потому что нечеткая логика - это одно из величайших достижений математики XX-ого века, если критерием брать практическую пользу. В этой статье я попытаюсь показать, насколько это простой и мощный инструмент программирования - настолько же простой, но гораздо более мощный, чем система обычных логических операций.

Самым замечательным фактом о нечеткой логике является то, что это прежде всего логика . Из начал мат-логики известно, что любая логическая функция может быть представлена дизъюнктивной или конъюнктивной нормальной формой, из чего следует, что для реализации исчисления высказываний достаточно всего трех операций: конъюнкции (&&), дизъюнкции (||) и отрицания (!). В классической логике каждая из этих операций задана таблицей истинности:

A b || a b && a ! -------- -------- ---- 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1
В нечеткой логике, в отличие от классической, вместо величин истина и ложь используется величина степень истинности , принимающая любые значения из бесконечного множества от 0 до 1 включительно. Следовательно логические операции уже нельзя представить таблично. В нечеткой логике они задаются фукнциями.

Есть два способа реализации дизъюнкции и конъюнкции:

#Максиминный подход: a || b => max(a, b) a && b => min(a, b) #Колорометрический подход: a || b => a + b - a * b a && b => a * b
Отрицание задается единственным способом (не трудно догадаться):

A => 1 - a
Легко проверить, что для крайних случаев - когда значения переменных исключительно 1 или 0 - приведенные выше функции дают таблицы истинности операций классической логики. Готово! Теперь у нас есть расширенная логика, обладающая невероятной мощью, простотой и при этом полностью совместимая с классической логикой в предельных случаях. Значит везде, где мы [программисты] используем логические выражения, мы можем использовать выражения нечеткой логики? Не совсем.

Дело в том, что все операторы языков программирования требуют четких условий, поэтому в какой-то момент всегда приходится из нечеткой степени истинности получать четкий критерий срабатывания. Это похоже на то, что происходит в квантовом мире: до тех пор, пока система эволюционирует в соответствии с уравнением Шредингера, ее квантовое состояние изменяется детерминированно и непрерывно, но как только мы прикасаемся к системе, происходит квантовый скачок, и система сваливается в одно из дискретных состояний. В нечеткой логике это называется дефаззификацией. Природа просто превращает квантовое состояние в вероятность и бросает кости, но вообще говоря методы дефаззификации бывают разные. Я не буду углубляться в эту тему, потому что объем ее тянет на отдельную статью. Упомяну лишь только, что метод дефаззификации следует выбирать, учитывая семантику задачи.

Для примера представим себе систему управления ракетой, использующую нечеткую логику для обхода препятствий. Представим себе, что ракета летит точно в гору, и система управления вычисляет решение: лететь вправо - 0.5, лететь влево - 0.5. Если использовать дефаззификацию методом центра масс, то система управления даст команду - лететь прямо. Бум! Очевидно, что в этом случае правильное решение - бросить кости и получить команду «влево» или «вправо» с вероятностью 50%.

В простейшем случае, когда нужно принять решение на основании степени истинности, можно разбить множество на интервалы и использовать if-else-if.

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

В качестве примера приведу использование нечеткой логики для решения задачи, которой я развлекался еще в институте - это задача поиска китайского иероглифа по изображению.

Я сразу отбросил идею распознавать любой каракуль, нарисованный пользователем на экране (тогда это был экран КПК). Вместо этого программа предлагала выбрать тип черты из порядка 23-х, определенных правилами японской каллиграфии. Выбрав тип черты, пользователь рисовал прямоугольник, в который вписывалась черта. Фактически, иероглиф - и введенный, и хранимый в словаре - представлялся в виде множества прямоугольников, для которых был определен тип.

Как определить равенство иероглифов в таком представлении? Для начала сформулируем критерий в четкой постановке:

Иероглифы A и B равны тогда и только тогда, когда для каждой черты в A существует равная ей черта в B и для каждой черты в B существует равная ей черта в A.

Неявно предполагается, что иероглифы не содержат черт-дубликатов, то есть, если некоторая черта совпала с чертой в другом иероглифе, то ни с одной другой чертой в том же иероглифе она совпасть не может.

Равенство черт можно определить следующим образом:

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

Эти два определения дают нам систему утверждений, которой достаточно для реализации алгоритма поиска.

Для начала построим матрицу E следующим образом:

For i in 1..n for j in 1..n E = A[i] == B[j] end end #A и B - это иероглифы; A[i] и B[j] - это их черты, и оператор "==" вычисляет их нечеткое равенство. #Предполагается, что оба иероглифа имеют одинаковое количество черт - n.
Затем сомкнем эту матрицу в вектор M[n]:

For i in 1..n M[i] = E.max_in_row(i) end #Метод max_in_row вычисляет максимальное значение в строке матрицы.
Я использую максиминный подход, потому что, на практике, колорометрический дает слишком маленькие значения для конъюнкций. Если вспомнить, что max - это дизъюнкция, то получается, что мы вычисляем утверждение, что i-я черта A равна первой черте B или второй или третьей и т.д. Таким образом M - это вектор совпадений черт A с чертами B.

#Просто нечеткой конъюнкцией. e = M.min #Либо так: e = M.sum / M.length #(отношение суммы элементов к длине вектора).
Оба способа работают, но по-разному, причем второй способ работает даже если сравнивать черты четко. Какой из них правильней - вопрос философский.

Еще пару слов стоит сказать о сравнении черт. В соответствии с определением, равенство черт - это конъюнкция двух условий: равенства типов и равенства прямоугольников. Черты некоторых типов очень похожи. Вводя, пользователь легко может их перепутать, поэтому стоит иметь таблицу похожести, значения которой будут отражать насколько черта i похожа на черту j (на главной диагонали, естественно, будут единицы). Как степень равенства прямоугольников можно брать отношение площади их пересечения к площади большего из прямоугольников.

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

6 сентября 2017 в возрасте 96 лет умер Лотфи Заде, создатель нечеткой логики.
6 сентября 2017 в компании, которая основана на технологиях нечеткой логики и нейронных сетей, и в которой я пока работаю, начались такие преобразования, которые только в рамках этой самой нечеткой логики и можно как-нибудь описать. И с завтрашнего дня будет расторгнут мой контракт, хотя если с 15 сентября я и становлюсь безработным, то это можно будет оценить только в терминах нечетной логики - на 0,28, на 0,78 или 1,58 - жизнь покажет.
А два года назад, к 50-летию нечеткой логики, Александр Малютин написал заметку на научпоп-сайт «Перельман перезвонит» (nowwow.info). Сайт этот ныне уже умер, и поэтому следует спасти статью. Ведь про нечетную логику написал журналист, который в свое время возглавлял «Известия». Кстати, блогеры-домохозяйки могут не выходить - нечетная логика объясняется на примере стиральной машины. Лучше поучитесь у профи, как надо писать.

К 50-ЛЕТИЮ ОДНОГО ИЗ САМЫХ УДАЧНЫХ МАТЕМАТИЧЕСКИХ ТЕРМИНОВ

Нечеткой логике полвека - в июне 1965 года в журнале Information and Control вышла основополагающая статья «Нечеткие множества» (Fuzzy Sets), которую написал американский математик азербайджанского происхождения Лотфи Заде. Долгих ему лет. Жаль, до юбилея не дожил британский математик танзанийского происхождения Ибрагим Мамдани, который в 1975 году представил первую реальную систему управления с нечеткой логикой - контроллер, следящий за работой парового двигателя. После чего технология стала активно развиваться, найдя применение во многих областях.

Заде 50 лет назад предложил математическое описание живой человеческой логики. В обычной математической логике есть только «истина» (обозначаемая еще числом 1) или «ложь» (0). В нечеткой логике степень истинности высказывания может быть любой - точнее, любым числом от 0 до 1. Красива ли вон та девушка? Ни да, ни нет, а «0,78; что красива».

Непривычно звучит. Как это вообще понять? Для простоты можно считать, что кто-то провел опрос, в котором 78% респондентов назвали девушку красивой, а остальные нет. А может ли быть от таких конструкций практическая польза? Вполне. Допустим, нужно принять решение, отправлять ли девушку на конкурс мисс чего-нибудь (серьезные расходы!), а для этого нужно оценить ее шансы на призовое место. Тогда-то и пригодятся оценки не только красоты, но и других важных для победы и тоже нечетких параметров: остроумия, эрудированности, доброты и т. п. Нужно только понять, откуда брать степени истинности и как оперировать с нечеткими данными. Заде понял. Необходимый для практики математический аппарат он разработал к 1973 году. Мамдани на его основе и сделал свой контроллер.

Заслуга Лотфи Заде не только в том, что он разработал новую теорию. Он ее крайне удачно назвал, выбрав общеупотребительное слово. Если бы вместо «нечеткой» взяли заумный термин, например, «континуальнозначная логика» (что, кстати, так и есть), у него не было бы шансов на широкую известность. Неспециалисты просто не употребляли бы это словосочетание, поскольку кто ж его знает, что оно означает.

Другое дело, когда у научного понятия есть бытовой омоним. Тогда обывателю кажется, что он понимает, о чем речь, особенно если посмотрел про это кино. Таких «понятных» терминов в математике и физике тоже немало. Черная дыра. Магический квадрат. Горизонт событий. Очарованный кварк. Теорема о двух милиционерах. Ну и конечно - матрица! Кто же не знает, что матрица - это когда Киану Ривз бегает по потолку. И не надо нам рассказывать про какие-то таблицы с числами.

Для развития науки вульгарные представления широких масс полезны. Обычных слов следовало бы даже добавить. Фильмов про горизонт событий снять побольше. Натяжек и ляпов не бояться. Главное, чтобы зритель ощущал прикосновение к переднему краю науки и величие человеческого, а, значит, и своего личного разума. Особенно если от такого зрителя зависит принятие решений о финансировании исследований.

Выдающийся советский ядерщик Георгий Флеров говорил: «Объяснять важному начальству научную проблему нужно не так, как правильно, а так, как ему будет понятно. Это ложь во благо». Правильно. Руководство не нужно смущать лекциями про «спонтанные нарушения электрослабой симметрии». Расскажите лучше про «частицу Бога» и «Великую тайну гравитации». Вранья, кстати, в этом особого нет - а инвестиции есть. Не беда, что околонаучные сказки порождают завышенные ожидания и, как следствие, избыточное вливание денег, заканчивающееся разорением. Общая польза в итоге перевешивает. Пузырь доткомов в 2001 году лопнул, но интернет-технологии получили мощнейший импульс.

Нечеткой логике в этом смысле повезло не только с собственным названием, но и с причислением к списку наук и технологий, объединенных названием «искусственный интеллект» - наряду с нейронными сетями, логическим программированием, экспертными системами и др. Это уже большая маркетинговая игра, где участники списка получают эффект от пакетной рекламы в рамках раскрутки единого научного мегабренда. Шутка ли: искусственный интеллект! Вот уж чарующая перспектива понятней некуда. Каждому в дом по железному слуге. Пусть умные кибернетические организмы делают всю работу, а мы будем только вводить пин-коды и пить пина-колады. Ради такого света в конце тоннеля не жаль никаких денег.

Флеровская «ложь во благо» на примере искусственного интеллекта сработала на 100%. Японское правительство с 1982-го по 1992 год потратило полмиллиарда долларов на разработку «компьютера пятого поколения» с элементами «мышления». Как задумывалось, не получилось. В частности, скис язык логического программирования Prolog, которому в 1980-е прочили первые роли. Ну и ладно. Все ж как с доткомами: роботов в некоторых странах в итоге все равно научились делать отличных.

Сегодня кибернетические системы видят, слышат и читают почти как люди, обыгрывают шахматных гроссмейстеров и зачастую эффективнее дипломированных специалистов управляют производственными процессами. Спасибо за столь мощное развитие темы помимо непосредственных разработчиков нужно сказать авторам удачной терминологии, а также Айзеку Азимову, Артуру Кларку, братьям Вачовски и всему коллективу киностудии имени Горького, подарившей советским детям образы роботов-вершителей.

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

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

Отметим, что он выдал два точных параметра, два конкретных числа: степень прозрачности раствора и скорость изменения прозрачности раствора. А вот дальше начинает работать алгоритм Ибрагима Мамдани.

На первом этапе, который называется фаззификацией (введением нечеткости), оба числа превращаются в нечеткие понятия. Допустим, мы ввели три градации загрязнения: «слабое», «среднее» и «сильное». Тогда вместо уровня прозрачности раствора появляются три нечетких суждения о загрязнении, скажем: «0,3; слабое», «0,6; среднее», «0,1; сильное».

Что значат эти цифры? Как и в случае с девушкой, чью нечеткую красоту мы обсуждали в начале текста, их можно считать результатами некоего референдума, на котором 30% граждан проголосовали, что загрязнение при данном уровне прозрачности раствора слабое, 60% - что среднее, 10% - сильное. А что, кто-то этот референдум проводил? Можно считать, что да.

В ходе разработки изделия собрались эксперты по машинной стирке и прикинули, как разложатся голоса «избирателей» в зависимости от уровня прозрачности раствора. А не шарлатанство ли это, спросите вы, математика же точная наука, какие еще эксперты по стирке? Да вот такие. Если вы всерьез хотите решить задачу, то найдете стоящих специалистов, чьи прикидки и оценки будут осмысленными и полезными.

Итак, у нас есть один нечеткий параметр «степень загрязнения», теперь нужен второй: «тип загрязнения». Проводим еще один «референдум». Допустим, он показал, что при такой скорости изменения концентрации раствора, которую нам выдал датчик, загрязнение следует считать, например, «0,2; малой жирности», «0,5; средней жирности», «0,3; большой жирности».

Наступает второй этап алгоритма: применение нечетких правил. Теперь вместе с экспертами мы обсуждаем, каким должно быть время стирки в зависимости от степени и типа загрязнения. Перебирая все возможные варианты, получаем - трижды три - девять правил следующего вида: «если загрязнение сильное и средней жирности, то время стирки - большое». Далее по законам логики (мы их для простоты пропустим) подсчитываем степень истинности для времени стирки. Пусть в результате нечеткое время стирки получилось таким: «0,1; малое», «0.7; среднее», «0,2; большое». Можно приступать к заключительному этапу.

Он называется дефаззификацией, то есть ликвидацией нечеткости - нам ведь необходимо дать машине точную вводную, сколько времени вращать барабан. Подходы есть разные, один из распространенных заключается в вычислении «центра тяжести». Допустим, эксперты сказали, что малое время стирки это 20 минут, среднее - 40 минут, большое - 60 минут. Тогда с учетом «веса» каждого значения получаем итоговый параметр: 20*0,1 + 40*0,7 + 60*0,2 = 42. Одежда будет «достаточно чистой» после 42 минут стирки. Ура.

Ибрагим Мамдани придумал красивую штуку, не правда ли? На первый взгляд, чуть ли не шаманство. У вас есть точные исходные цифры и нужно из них получить другие точные цифры. Но вы не корпите над выводом формул, а погружаетесь в мир нечетких понятий, как-то там ими оперируете, а потом возвращаетесь обратно в «точный» мир - с готовым ответом на руках.

Производители стиральных машин даже принялись рекламировать применение нечеткой логики и прямо на изделиях или в инструкциях писать Fuzzy Logic, Fuzzy Control, Logic Control. Бизнесмены люди прагматичные и не размещают каких попало слов на своем товаре. Так что если вы увидели на машине надпись Fuzzy Logic, это значит: она «продает» товар. Технология помимо своих сугубо потребительских свойств гипнотизирует покупателя еще и названием, мотивируя на расставание с лишней сотней долларов. Уж не знаю, получает ли с этого роялти Лотфи Заде, но это было бы справедливо. Ни один другой раздел математики на бытовой технике не упоминается.

Но вы же заметили, наверное, что по ходу описания работы стиральной машины с нечеткой логикой не встретилось ни одного места, где можно было бы заподозрить, что у машины появился собственный разум. Только инструкции вроде служебных, только решение запрограммированных задач. Машина будет вовремя сливать воду. Но она не будет понимать, что она делает и зачем. В ее микропроцессорную голову никогда не придет мысль перестать стирать и ради прикола устроить в ванной потоп. Если только эта мысль не посетит программиста, который для прикола встроит в машину еще какую-нибудь Funny Logic. Сама же машина до такого додуматься не может.

Вот вам и весь искусственный интеллект. Роботы учатся только имитировать человеческую деятельность, пусть даже такую, на которую мы сейчас тратим интеллектуальные усилия, например, на перевод с другого языка. Пусть даже они переводят лучше. Вы же не обижаетесь на подъемный кран, что он сильнее вас. И появление кранов не привело к исчезновению штангистов. Только теперь поднятие тяжестей это спорт и удовольствие, а таскать на себе мешки с цементом на стройке не надо. С переводами то же самое. Программа не умнее нас, просто мы смогли формализовать и эффективно сгрузить на нее некоторые наши умения, и теперь можем не тратить свои интеллектуальные усилия на технические переводы, а заняться, скажем, Шекспиром.
Считать, что машины приобретают интеллект благодаря передовым достижениям кибернетики - все равно что верить в карго-культ. Помните, как жители затерянного острова, увидев в небе самолет, сделали такую же фигуру из соломы и думали, что полетит? Они тогда ничего не знали о металлах и керосине, не говоря уже о подъемной силе - и поди объясни.

Так и у нас с «искусственным интеллектом». Роботы скоро смогут водить автомобили и наверняка когда-нибудь обыграют команду людей в футбол - тем более, что этот момент приближают не только японские инженеры, но и наша сборная. Но это будет не более чем имитация разумных действий на поле. Как те аборигены, мы не знаем пока чего-то критически важного, что позволило бы создать разумное существо.

У нас, говоря словами Станислава Лема, обязательно получится Усилитель Умения Водить Авто - как уже получился Усилитель Умения Остановить Стирку. А вот Усилитель Интеллекта, появление которого предсказывал великий фантаст, на основе нынешних технологий «искусственного интеллекта», в том числе нечеткой логики, несмотря на все ее изящество и полезность, не получится. Нечеткая логика это всего лишь способ сократить объем вычислений при решении некоторого класса задач. И на том спасибо.

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

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

Человеческое мышление - это совмещение интуиции и строгости, которое, с одной стороны, рассматривает мир в целом или по аналогии, а с другой стороны - логически и последовательно и, значит, представляет собой нечеткий механизм. Законы мышления, которые мы захотели бы включить в программы компьютеров, должны быть обязательно формальными; законы мышления, проявляемые в диалоге человека с человеком - нечеткие. Можем ли мы поэтому утверждать, что нечеткая логика может быть хорошо приспособлена к человеческому диалогу? Да - если математическое обеспечение , разработанное с учетом нечеткой логики , станет операционным и сможет быть технически реализовано, то человеко-машинное общение станет намного более удобным, быстрым и лучше приспособленным к решению проблем.

Термин " нечеткая логика " используется обычно в двух различных значениях. В узком смысле, нечеткая логика - это логическое исчисление, являющееся расширением многозначной логики. В ее широком смысле, который сегодня является преобладающим в использовании, нечеткая логика равнозначна теории нечетких множеств. С этой точки зрения, нечеткая логика в узком смысле является разделом нечеткой логики в широком смысле.

Определение . Любая нечеткая переменная характеризуется тройкой

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

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

Рассмотрим теперь различные подходы к определению основных операций над нечеткими переменными , а именно конъюнкции, дизъюнкции и отрицания. Данные операции являются основными для нечеткой логики в том смысле, что все ее конструкции основываются на этих операциях. В настоящее время в нечеткой логике в качестве операций конъюнкции и дизъюнкции широко используют -нормы и -конормы, пришедшие в нечеткую логику из теории вероятностных метрических пространств. Они достаточно хорошо изучены и лежат в основе многих формальных построений нечеткой логики . В то же время расширение области приложений нечеткой логики и возможностей нечеткого моделирования вызывает необходимость обобщения этих операций. Одно направление связано с ослаблением их аксиоматики с целью расширения инструментария нечеткого моделирования. Другое направление обобщения операций конъюнкции и дизъюнкции нечеткой логики связано с заменой множества значений принадлежности на линейно или частично упорядоченное множество лингвистических оценок правдоподобности. Эти обобщения основных операций нечеткой логики , с одной стороны, вызываются необходимостью разработки экспертных систем, в которых значения истинности фактов и правил описываются экспертом или пользователем непосредственно в лингвистической шкале и носят качественный характер. С другой стороны, такие обобщения вызываются смещением направления активного развития нечеткой логики от моделирования количественных процессов, поддающихся измерению, к моделированию процессов мышления человека, где восприятие мира и принятие решений происходит на основе гранулирования информации и вычисления словами.

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

Стандартная статья о нечеткой логике обычно грешит двумя вещами:

  1. В 99% случаев статья касается исключительно применения нечеткой логики в контексте нечетких множеств, а точнее нечеткого вывода, а еще точнее алгоритма Мамдани. Складывается впечатление, что только этим способом нечеткая логика может быть применена, однако это не так.
  2. Почти всегда статья написана на математическом языке. Замечательно, но программисты пользуются другим языком с другими обозначениями. Поэтому оказывается, что статья просто непонятна тем, кому, казалось бы, должна быть полезна.
Все это грустно, потому что нечеткая логика - это одно из величайших достижений математики XX-ого века, если критерием брать практическую пользу. В этой статье я попытаюсь показать, насколько это простой и мощный инструмент программирования - настолько же простой, но гораздо более мощный, чем система обычных логических операций.

Самым замечательным фактом о нечеткой логике является то, что это прежде всего логика . Из начал мат-логики известно, что любая логическая функция может быть представлена дизъюнктивной или конъюнктивной нормальной формой, из чего следует, что для реализации исчисления высказываний достаточно всего трех операций: конъюнкции (&&), дизъюнкции (||) и отрицания (!). В классической логике каждая из этих операций задана таблицей истинности:

A b || a b && a ! -------- -------- ---- 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1
В нечеткой логике, в отличие от классической, вместо величин истина и ложь используется величина степень истинности , принимающая любые значения из бесконечного множества от 0 до 1 включительно. Следовательно логические операции уже нельзя представить таблично. В нечеткой логике они задаются фукнциями.

Есть два способа реализации дизъюнкции и конъюнкции:

#Максиминный подход: a || b => max(a, b) a && b => min(a, b) #Колорометрический подход: a || b => a + b - a * b a && b => a * b
Отрицание задается единственным способом (не трудно догадаться):

A => 1 - a
Легко проверить, что для крайних случаев - когда значения переменных исключительно 1 или 0 - приведенные выше функции дают таблицы истинности операций классической логики. Готово! Теперь у нас есть расширенная логика, обладающая невероятной мощью, простотой и при этом полностью совместимая с классической логикой в предельных случаях. Значит везде, где мы [программисты] используем логические выражения, мы можем использовать выражения нечеткой логики? Не совсем.

Дело в том, что все операторы языков программирования требуют четких условий, поэтому в какой-то момент всегда приходится из нечеткой степени истинности получать четкий критерий срабатывания. Это похоже на то, что происходит в квантовом мире: до тех пор, пока система эволюционирует в соответствии с уравнением Шредингера, ее квантовое состояние изменяется детерминированно и непрерывно, но как только мы прикасаемся к системе, происходит квантовый скачок, и система сваливается в одно из дискретных состояний. В нечеткой логике это называется дефаззификацией. Природа просто превращает квантовое состояние в вероятность и бросает кости, но вообще говоря методы дефаззификации бывают разные. Я не буду углубляться в эту тему, потому что объем ее тянет на отдельную статью. Упомяну лишь только, что метод дефаззификации следует выбирать, учитывая семантику задачи.

Для примера представим себе систему управления ракетой, использующую нечеткую логику для обхода препятствий. Представим себе, что ракета летит точно в гору, и система управления вычисляет решение: лететь вправо - 0.5, лететь влево - 0.5. Если использовать дефаззификацию методом центра масс, то система управления даст команду - лететь прямо. Бум! Очевидно, что в этом случае правильное решение - бросить кости и получить команду «влево» или «вправо» с вероятностью 50%.

В простейшем случае, когда нужно принять решение на основании степени истинности, можно разбить множество на интервалы и использовать if-else-if.

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

В качестве примера приведу использование нечеткой логики для решения задачи, которой я развлекался еще в институте - это задача поиска китайского иероглифа по изображению.

Я сразу отбросил идею распознавать любой каракуль, нарисованный пользователем на экране (тогда это был экран КПК). Вместо этого программа предлагала выбрать тип черты из порядка 23-х, определенных правилами японской каллиграфии. Выбрав тип черты, пользователь рисовал прямоугольник, в который вписывалась черта. Фактически, иероглиф - и введенный, и хранимый в словаре - представлялся в виде множества прямоугольников, для которых был определен тип.

Как определить равенство иероглифов в таком представлении? Для начала сформулируем критерий в четкой постановке:

Иероглифы A и B равны тогда и только тогда, когда для каждой черты в A существует равная ей черта в B и для каждой черты в B существует равная ей черта в A.

Неявно предполагается, что иероглифы не содержат черт-дубликатов, то есть, если некоторая черта совпала с чертой в другом иероглифе, то ни с одной другой чертой в том же иероглифе она совпасть не может.

Равенство черт можно определить следующим образом:

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

Эти два определения дают нам систему утверждений, которой достаточно для реализации алгоритма поиска.

Для начала построим матрицу E следующим образом:

For i in 1..n for j in 1..n E = A[i] == B[j] end end #A и B - это иероглифы; A[i] и B[j] - это их черты, и оператор "==" вычисляет их нечеткое равенство. #Предполагается, что оба иероглифа имеют одинаковое количество черт - n.
Затем сомкнем эту матрицу в вектор M[n]:

For i in 1..n M[i] = E.max_in_row(i) end #Метод max_in_row вычисляет максимальное значение в строке матрицы.
Я использую максиминный подход, потому что, на практике, колорометрический дает слишком маленькие значения для конъюнкций. Если вспомнить, что max - это дизъюнкция, то получается, что мы вычисляем утверждение, что i-я черта A равна первой черте B или второй или третьей и т.д. Таким образом M - это вектор совпадений черт A с чертами B.

#Просто нечеткой конъюнкцией. e = M.min #Либо так: e = M.sum / M.length #(отношение суммы элементов к длине вектора).
Оба способа работают, но по-разному, причем второй способ работает даже если сравнивать черты четко. Какой из них правильней - вопрос философский.

Еще пару слов стоит сказать о сравнении черт. В соответствии с определением, равенство черт - это конъюнкция двух условий: равенства типов и равенства прямоугольников. Черты некоторых типов очень похожи. Вводя, пользователь легко может их перепутать, поэтому стоит иметь таблицу похожести, значения которой будут отражать насколько черта i похожа на черту j (на главной диагонали, естественно, будут единицы). Как степень равенства прямоугольников можно брать отношение площади их пересечения к площади большего из прямоугольников.

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