- •Лабораторная 3
- •Проделать то же самое посредством функций, записав соответствующий m-файл, используя один из трех методов генерации системы нечеткого вывода
- •Структура нейронной сети
- •Архитектура anfis-сети.
- •Реализация anfis в среде matlab
- •Anfis-редактор
- •Создание гибридной сети
- •Работа в системе fis
- •Визуализация структуры сети
- •Обучение сети
- •Пример решения задачи нейро-нечеткого вывода
- •Функции для работы с системой anfis
Функции для работы с системой anfis
Генерирование исходной системы нечеткого логического вывода типа Сугено из данных без использования кластеризации
Синтаксис:
fis = genfis1(data, numMFs, inmftype, outmftype)
Описание:
Функция genfis1 генерирует из данных систему нечеткого логического вывода типа Сугено. Функции принадлежностей входных переменных выбираются таким образом, чтобы термы равномерно распределялись внутри диапазона изменения данных. Количество правил базы знаний определяется как произведение мощностей терм-множеств входных переменных, другими словами, функция genfis1 генерирует все возможные правила. Коэффициенты линейного полинома, который связывает входные и выходную переменные в области действия правила, назначаются равными нулю. Это означает, что при любых значениях входных переменных на выходе системы будет нулевое значение. Полученная система нечеткого логического вывода не отражает представленные данными закономерности между входами и выходом. Она является исходной системой для обучения посредством технологии ANFIS, в результате которого закономерности, заложенные в данных, будут идентифицированы.
Функция genfis1 может имеет до четырех входных аргументов:
data – матрица исходных данных, каждая строчка которой является парой “входы – выход”;
numMFs – необязательный аргумент, задающий количество термов для оценки входных переменных. Если количество термов одинаковое для всех переменных, тогда достаточно задать скалярное значение этого аргумента. Значение по умолчанию – 2;
inmftype – необязательный аргумент, задающий типы функций принадлежности термов входных переменных. Значение этого аргумента в виде одной строки символов указывает на то, что все функции принадлежности одного типа. Массив строк задает тип функций принадлежностей для каждой входной переменной. По умолчанию используется обобщенная колоколообразная функция принадлежности;
outmftype – необязательный аргумент, задающий тип функций принадлежности термов выходных переменных (точнее тип зависимости, связывающей входные и выходную переменные в области действия правила). Допустимые значения: ‘linear’ – линейная и 'constant' – константа. По умолчанию используется линейная зависимость.
Функция genfis1 возвращает выходной аргумент fis, содержащий систему нечеткого логического вывода типа Сугено.
Пример:
data = [rand(10,1) 10*rand(10,1)-5 rand(10,1)];
fis = genfis1(data,[3 7],char('pimf','trimf'))
Генерирование системы нечеткого логического вывода из данных data. Система использует три терма с пи-подобными функциями принадлежности для оценки первой входной переменной и семь термов с треугольными функциями принадлежности для оценки второй входной переменной.
Генерирование системы нечеткого логического вывода типа Сугено из данных с использованием субтрактивной кластеризации
Синтаксис:
fis = genfis2(Xin, Xout, radii, xBounds, options)
Описание:
Функция genfis2 генерирует систему нечеткого логического вывода типа Сугено из данных с использованием субтрактивной кластеризации. При использовании данных только с одной выходной переменной, результат выполнения функции genfis2 может рассматриваться как исходная система для обучения посредством технологии ANFIS.
Генерирование правил из данных в функции genfis2 происходит в два этапа. Вначале используется функция subclust для определения количества правил и мощностей терм-множеств выходных переменных. Затем с помощью метода наименьших квадратов определяется "то-"часть каждого правила. В результате этого получается система нечеткого логического вывода с базой правил, покрывающих все предметную область.
Функция genfis2 может иметь до пяти входных аргументов, первые три из которых обязательны:
Xin – матрица, в которой каждая строчка содержит значения входных переменных данных;
Xout – матрица, в которой каждая строчка содержит значения выходных переменных данных;
radii – вектор, определяющий размеры области правил по каждой координате. Значения координат вектора radii должны находиться в диапазоне [0, 1] в связи с тем, что во время выполнения функции subclust данные масштабируется на единичный гиперкуб. Если значение radii задано скаляром, тогда все координаты считаются равноважными;
xBounds – матрица диапазонов изменения данных, необходимая для их масштабирования на единичный гиперкуб. Каждый столбец матрицы задает диапазон изменения данных по одной координате, таким образом размер матрицы – 2 x p, где р – количество входных и выходных переменных. Если аргумент xBounds не задан, тогда диапазоны изменения данных рассчитываются функцией subclust по фактическим значениям матриц Xin и Xout;
options – вектор параметров кластерного анализа, берутся значения по умолчанию.
Пример:
x=2*rand(100,2); y=x(:,1).^2+2*x(:,2); fis=genfis2(x, y, 0.5)
y_fis=evalfis(x, fis);
plot(y, y_fis, 'r.')
hold on
min_y=min(y); max_y=max(y); plot([min_y max_y], [min_y max_y], '-k')
xlabel('target') ylabel('fis output')
В первых двух строчка примера задаются 100 пар точек “входы-выход”, связанных зависимостью y=x1^2+2*x2. Затем генерируется система нечеткого логического вывода, которая идентифицирует представленную данными зависимость. На рисунке показано желаемое (сплошная линия) и действительное (красные точки) поведения нечеткой модели. Как видно из рисунка, даже без использования технологии обучения ANFIS, нечеткая модель, синтезированная функцией genfis2, хорошо описывает данные.
Генерирование исходной системы нечеткого логического вывода из данных с использованием нечеткой кластеризации
Синтаксис:
fismat = genfis3(Xin,Xout)
fismat = genfis3(Xin,Xout,type)
fismat = genfis3(Xin,Xout,type,cluster_n)
fismat = genfis3(Xin,Xout,type,cluster_n,fcmoptions)
Описание
genfis3 генерирует систему нечеткого вывода, используя алгоритм FCM путем выделения множества правил, которые моделируют поведение данных. Функция использует в качестве входных параметров массив входных данных и массив выходных данных. Если имеется один столбец выходных данных, genfis3 может использоваться для генерации начальной FIS для обучения с помощью anfis. Метод выделения правил вначале использует функцию fcmfunction для определения числа правил и функций принадлежности для посылок и заключений.
fismat = genfis3(Xin,Xout) генерирует FISтипа Сугено при заданных входных данных Xin и выходных данных Xout. Матрицы Xin иXout имеют по одной колонке.
fismat = genfis3(Xin,Xout,type) генерирует FIS определенного типа, где параметр type или 'mamdani', или 'sugeno'.
fismat = genfis3(Xin,Xout,type,cluster_n) генерирует FIS определенного типа и позволяет определить число кластеров(cluster_n) дляFCM. Число кластеров определяет число правил и число функций принадлежности в генерируемой FIS. cluster_n должен быть или целое или 'auto', в этом случае используется алгоритм subclust с радиусом 0.5 для нахождения числа кластеров.
По умолчанию функция принадлежности для входа 'gaussmf' и для выхода 'linear'.
Пример
Функция genfis3,используя минимальное число аргументов генерирует FIS, используя значения по умолчанию.
Xin1 = 7*rand(50,1);
Xin2 = 20*rand(50,1)-10;
Xin = [Xin1 Xin2];
Xout = 5*rand(50,1);
fismat = genfis3(Xin,Xout);
Генерирования исходных параметров функций принадлежности для ANFIS-обучения
Синтаксис:
mf_param = genparam(data, mf_n, mf_type)
Описание:
Функция genparam генерирует параметры функций принадлежности таким образом, чтобы центры функций принадлежностей располагались через равные промежутки внутри интервалов изменения данных.
Функция genparam может имеет три входных аргумента, первый из которых обязательный:
data – матрица данных “входы – выход”. Каждая строка данных содержит одну пару “входы – выход”. Последний столбец матрицы содержит значения выходной переменной, а остальные – значения входных переменных;
mf_n – вектор, задающий количество термов, которыми оценивается каждая входная переменная. Если аргумент задан скалярным значением, то количество термов принимается одинаковым для всех входных переменных. Значение по умолчанию – 2;
mf_type – матрица строк, определяющая тип функций принадлежности для каждой входной переменной. Если аргумент задан одной строкой, тогда все функции принадлежности будут иметь один и тот же тип. Значение по умолчанию - 'gbellmf' (обобщенная колоколообразная функция принадлежности). Функция genparam не поддерживает следующие типы функции принадлежностей: 'sigmf', 'smf' и 'zmf'.
Функция genparam возвращает матрицу mf_param, каждая строчка которой содержит параметры одной функций принадлежности. Первая строка матрицы соответствует параметрам первой функции принадлежности первой входной переменной, вторая - второй функции принадлежности первой входной переменной, …, последняя - последней функции принадлежности последней входной переменной.
Пример:
NumData = 1000;
data = [rand(NumData,1) 10*rand(NumData,1)-5 rand(NumData,1)];
NumMf = [3 7];
MfType = str2mat('trapmf','gbellmf');
MfParams = genparam(data,NumMf,MfType);
set(gcf,'Name','genparam','NumberTitle','off'); NumInput = size(data, 2) - 1;
range = [min(data)' max(data)'];
FirstIndex = [0 cumsum(NumMf)];
for i = 1:NumInput;
subplot(NumInput, 1, i);
x = linspace(range(i, 1), range(i, 2), 100);
index = FirstIndex(i)+1:FirstIndex(i)+NumMf(i);
mf = evalmmf(x, MfParams(index, :), MfType(i,:));
plot(x, mf');
xlabel(['input ' num2str(i) ' (' MfType(i, :) ')']);
end
Генерирование трех треугольных и семи колоколообразных функций принадлежностей из 1000 пар случайно полученных данных “входы-выход”.
Настройка систем нечеткого логического вывода типа Сугено
Синтаксис:
[fis, error] = anfis(trndata)
[fis, error] = anfis(trndata, initfis)
[fis, error, stepsize] = anfis(trndata, initfis, trnopt, dispopt, [], optmethod)
[fis, error, stepsize, chkfis, chkerror] = anfis(trndata, initfis, trnopt, dispopt, chkdata)
Описание:
Это основная функция настройки систем нечеткого логического вывода типа Сугено. Настройка представляет собой итерационную процедуру нахождения таких параметров системы нечеткого логического вывода, в частности параметров функций принадлежности, которые минимизируют расхождения между результатами логического вывода и экспериментальными данными, т. е. между действительным и желаемым поведениями системы. Экспериментальные данные, по которым настраивается функции принадлежности, представляются в виде обучающей выборки.
Функция anfis может имеет шесть входных аргументов:
trndata – обучающая выборка. Этот входной аргумент является обязательным. Обучающая выборка представляет собой матрицу, каждая строчка которой является парой “входы-выход”. Последний столбец матрицы соответствует вектору значений выхода, а все остальные столбцы – входным данным;
initfis – идентификатор исходной системы нечеткого логического вывода, функции принадлежности которой будут настроены с помощью anfis. Исходная система нечеткого логического вывода должна быть системой типа Сугено нулевого или первого порядка. Еще одним ограничением anfis является недопустимым использования типов функций принадлежностей и методов дефаззификации, определяемых пользователем. При отсутствии аргумента initfis функция anfis вызовет функцию genfis1, которая генерирует типовую систему нечеткого логического вывода. Эта типовая система будет использовать по две функции принадлежности гауссовского типа для каждой входной переменной. В случае, когда пользователь хочет получить систему с иным количеством функций принадлежности, необходимо задать в виде аргумента initfis количество функций принадлежности для оценки каждой входной переменной. Если количество функций принадлежности одинаково для всех входов, тогда достаточно указать только одно значение.
trnopt – вектор параметров настройки:
trnopt(1) – количество итераций (значение по умолчанию – 10); trnopt(2) – допустимая ошибка обучения (значение по умолчанию – 0); trnopt(3) – исходная длина шага (значение по умолчанию – 0.01); trnopt(4) – коэффициент уменьшения длины шага (значение по умолчанию – 0.9); trnopt(5) – коэффициент увеличения длины шага (значение по умолчанию – 1.1);
dispopt – вектор, указывающий какие промежуточные результаты обучения выводить в командное окно MatLab во время настройки. Для вывода информации на экран необходимо установить соответствующую координату вектора в 1. Вектор dispopt имеет четыре координаты:
dispopt(1) – ANFIS-информация: количество функций принадлежности входных и выходной переменных и т.п.;
dispopt(2) – ошибка обучения;
dispopt(3) – длина шага, (выводится в случае его изменения); dispopt(4) – окончательный результат.
По умолчанию значения всех координат равны 1;
chkdata – идентификатор тестирующей выборки. Тестирующая выборка используется для исследования свойства обобщения системы нечеткого логического вывода, т. е. способности системы выдавать правильные результаты для данных, отсутствующих в обучающей выборке. Формат тестирующей выборки такой же как и обучающей. Обычно элементы тестирующей выборки несколько отличаются от элементов обучающей выборки. Тестирующая выборка особенно важна для задач обучения с большим количеством входов и (или) для задач с зашумленными данными. При формировании обучающей и тестирующей выборок необходимо стремится к обеспечению свойств представительности выборок;
optmethod – метод оптимизации, используемый для настройки. Допустимые значения: 1 – гибридный алгоритм и 0 – метод обратного распространения ошибки. По умолчанию применяется гибридный алгоритм, который использует метод обратного распространения ошибки (метод наискорейшего спуска) для настройки функций принадлежности входных переменных и метод наименьших квадратов для настройки функций принадлежности выхода. Точнее говоря, метод наименьших квадратов используется для нахождения коэффициентов линейных функций, связывающих входы и выход в каждом правиле. Метод по умолчанию используется всегда, за исключением случая, когда значение аргумента optmethod равно 0.
Функция anfis может иметь пять выходных аргументов:
fis – система нечеткого логического вывода, параметры которой настроены таким образом, что минимизируют расхождения между результатами логического вывода и экспериментальными данными из обучающей выборки;
error – вектор, содержащий значения ошибки обучения на каждой итерации. Ошибка обучения рассчитывается как среднее квадратическое отклонение между результатами нечеткого логического вывода и значениями выходной переменной из обучающей выборки;
stepsize – вектор, содержащий значения длины шага алгоритма оптимизации на каждой итерации;
chkfis – система нечеткого логического вывода, параметры которой настроены таким образом, что минимизируют расхождения между результатами логического вывода и экспериментальными данными из тестирующей выборки. Для получения такой системы необходимо задать пятый входной аргумент функции anfis – тестирующую выборку;
chkerror - вектор, содержащий значения ошибки тестирования на каждой итерации. Ошибка тестирования рассчитывается как средне- квадратичное отклонение между результатами нечеткого логического вывода и значениями выходной переменной из тестирующей выборки. Для расчета ошибки тестирования необходимо задать пятый входной аргумент функции anfis – тестирующую выборку.
Процесс настройки прекращается по достижению требуемой ошибки обучения настройки или после выполнения указанного количества итераций.
Функция anfis может быть вызвана с одним входным аргументом – обучающей выборкой и одним выходным аргументом – системой нечеткого логического вывода, параметры которой настроены по обучающей выборке. При вызове функции anfis значения неинициализированых аргументов принимаются равными по умолчанию. При инициализации только части аргументов, например, первого и шестого – обучающей и тестирующей выборок, значения остальных аргументов (для нашего примера - второго, третьего, четвертого и пятого) необходимо задать как []. Значение [] указывает, что соответствующий аргумент принимает значения, установленные по умолчанию.
Пример.
Синтезируется и настраивается система нечеткого логического вывода fis, моделирующая зависимость y=sin(x) в диапазоне [0, 1].
x=(0:0.04:1)’; y=sin(x); trndata=[x y];
[fis, error, stepsize]=anfis(trndata)
Замена правил нечеткой базы знаний |
Синтаксис:
outfis = parsrule (infis, inrulelist, ruleformat, lang)
[outfis, outrulelist, errorstr] = parsrule (infis, inrulelist, ruleformat, lang)
Описание:
Функция parsrule предназначена для ввода правил в нечеткую базу знаний. При этом удаляются ранее существующие в базе знаний правила. Функция parsrule может иметь до четырех входных аргументов, первые два из которых обязательные:
infis - идентификатор исходной системы нечеткого логического вывода;
inrulelist - список правил "если - то". Правила можно задавать в виде предложений на английском, немецком и французских языках. При задании правил на естественном языке необходимо использовать следующие ключевые слова:
- для английского языка - "if", "and", "or", "then", "is", "not"; - для французского языка - "si", "et", "ou", "alors", "est ","n''est_pas";
- для немецкого языка - "senn", "und", "oder", "dann", "ist", "nicht", которые эквиваленты русским словам "если", "и", "или", "то", "есть", "не", соответственно. Весовой коэффициент можно указать в конце правила. По умолчанию значение весового коэффициента равно 1. Список правил задается в виде матрицы, каждая строчка которой определяет одно правило;
ruleformat - формат правил. Допустимые значения: 'verbose' - словесный;
'symbolic' - символьный;
'indexed' - индексный.
Значение по умолчанию - 'verbose'. В формате 'verbose' невозможно в качестве значений переменной использовать терм 'none'. Для задания "коротких" правил необходимо из правила исключить наименования соответствующих переменных;
lang - язык представления правил в формате 'verbose'. Допустимые значения: 'english' - английский;
'francais' - французский;
'deutsch' - немецкий.
По умолчанию установлен английский язык.
Функция parsrule может иметь до трех выходных аргументов:
outfis - идентификатор системы нечеткого логического вывода с новыми правилами;
outrulelist - список правил системы outfis. Список представляет собой матрицу целых положительных чисел, соответствующих правилам, заданных матрицей inrulelist. Для преобразования чисел в символы необходимо использовать функцию char. Вошедшие в outfis корректно заданные правила в этом списке имеют порядковый номер. Наличие символа '#' указывает на то, что соответствующее правило является некорректным.
errorstr - список ошибок задания правил.
Пример:
infis=readfis('tipper'); r1='if service is good then tip is average ';
r2='if service is poor and food is rancid then tip is cheap ';
r3='if service is excellent and food is delicious then tip is generous';
inrulelist=[r1; r2; r3];outfis=parsrule(infis,inrulelist)
Загружается в рабочую область демонстрационная система нечеткого логического вывода "Tipper", задающая зависимость размера чаевых от качества пищи и уровня сервиса в ресторане. Затем формируется новая база знаний, содержащая следующие правила:
"if service is good then tip is average";
"if service is poor and food is rancid then tip is cheap";
"if service is excellent and food is delicious then tip is generous'".
Синтаксис: plotfis ( fis ) Описание: Функция plotfis выводит в графическом окне структуру системы нечеткого логического вывода fis. Входные переменные системы изображаются в левой части графического окна, выходные переменные – в правой части, в центре – база знаний. В графическом окне выводится наименование и тип системы нечеткого логического вывода, количество термов для каждой переменной и количество правил. Также изображаются графики функций принадлежности всех термов. Пример: a=readfis(‘tipper’); plotfis(a) Вывод структуры демонстрационной системы нечеткого логического вывода “Tipper”.
|
|
