Функции Fuzzy Logic Toolbox для работы с fis
Изображение структуры системы нечеткого логического вывода |
Синтаксис:
plotfis ( fis )
Описание:
Функция plotfis выводит в графическом окне структуру системы нечеткого логического вывода fis.
Входные переменные системы изображаются в левой части графического окна, выходные переменные – в правой части, в центре – база знаний.
В графическом окне выводится наименование и тип системы нечеткого логического вывода, количество термов для каждой переменной и количество правил. Также изображаются графики функций принадлежности всех термов.
Пример:
a=readfis(‘tipper’); plotfis(a)
Вывод структуры демонстрационной системы нечеткого логического вывода
“Tipper”.
|
Создание новой системы нечеткого логического вывода |
Синтаксис:
fis = newfis(fis_name, fis_type)
Описание:
Создает в рабочей области новую систему нечеткого логического вывода. Функция newfis может иметь до семи входных аргументов:
fis_name - наименование системы нечеткого логического вывода;
fis_type - тип системы нечеткого логического вывода. Допустимые значения:'mamdani' - система типа Мамдани (значение по умолчанию);'Sugeno' - система типа Сугэно;
Пример:
a=newfis('new_fuzzy_system')
В рабочей области создается структура a, содержащая систему нечеткого логического вывода с именем
|
Добавляет переменную в систему нечеткого логического вывода |
Синтаксис:
FIS_name= addvar (FIS_name, varType, varName, varBound)
Описание:
Переменную можно добавить только к существующей в рабочей области MatLab системе нечеткого логического вывода. Функция addrvar имеет четыре входных аргумента:
FIS_name – идентификатор системы нечеткого логического вывода в рабочей области MatLab;
varType – тип добавляемой переменной. Допустимые значения - ‘input’ - входная переменная и ‘output’ – выходная переменная;
varName – наименование добавляемой переменной. Задается в виде строки символов;
varBound – вектор, задающий диапазон изменения добавляемой переменной.
Порядковый номер переменной в системе нечеткого логического вывода соответствует порядку добавления с помощью функции addvar, т.е. первая добавленная переменная будет иметь порядковый номер 1. Входные и выходные переменные нумеруются независимо.
Пример.
FIS_name=addvar(FIS_name, ‘input’, ‘Рост’, [155 205])
Строка добавляет в систему нечеткого логического вывода FIS_name входную переменную ‘Рост’, заданную на интервале [155 205].
|
Добавляет функцию принадлежности к системе нечеткого логического вывода |
Синтаксис:
FIS_name=addmf(FIS_name, varType, varIndex, mfName, mfType, mfParams)
Описание:
Функцию принадлежности можно добавить только к существующей в рабочей области MatLab системе нечеткого логического вывода. Другими словами система нечеткого логического вывода должна быть каким-то образом загружена в рабочую область или создана с помощью функции newfis. Функция addmf имеет шесть входных аргументов:
FIS_name – идентификатор системы нечеткого логического вывода в рабочей области MatLab;
varType – тип переменной, к которой добавляется функция принадлежности. Допустимые значения - ‘input’ - входная переменная и ‘output’ – выходная переменная;
varIndex – порядковый номер переменной, к которой добавляется функция принадлежности;
mfName – наименование добавляемой функции принадлежности (терм). Задается в виде строки символов;
mfType – тип (модель) добавляемой функции принадлежности. Задается в виде строки символов;
mfParams – вектор параметров добавляемой функции принадлежности.
Порядковый номер функции принадлежности в системе нечеткого логического вывода соответствует порядку добавления с помощью функции addmf, т.е. первая добавленная функция принадлежности всегда будет иметь порядковый номер 1. С помощью функции addmf невозможно добавить функцию принадлежности к несуществующей переменной. В этом случае необходимо вначале добавить переменную к системе нечеткого логического вывода с помощью функции addvar.
Пример.
FIS_name=addmf(FIS_name, ‘input’, 1, ‘низкий’, ‘trapmf’, [150, 155, 165, 170])
Строка добавляет в терм-множество первой входной переменной нечеткой системы FIS_name терм ‘низкий’ с трапециевидной функцией принадлежности с параметрами [150, 155, 165, 170].
|
Добавляет правила в базу знаний системы нечеткого логического вывода |
Синтаксис:
FIS_name= addrule (FIS_name, ruleList)
Описание:
Правила можно добавить только к существующей в рабочей области MatLab системе нечеткого логического вывода. Функция addrule имеет два входных аргумента:
FIS_name – идентификатор системы нечеткого логического вывода в рабочей области MatLab;
ruleList – матрица добавляемых правил.
Матрица правил должна быть задана в формате indexed. Количество строк матрицы ruleList равно количеству добавляемых правил, т.е. каждая строка матрицы соответствует одному правилу. Количество столбцов матрицы равно m+n+2, где m (n) – количество входных (выходных) переменных системы нечеткого логического вывода.
Первые m столбцов соответствуют входным переменным, т.е. задают ЕСЛИ-часть правил. Элементы этих столбцов содержат порядковые номера термов, используемых для лингвистической оценки соответствующих входных переменных. Значение 0 указывает, что соответствующая переменная в правиле не задана, т.е. ее значение равно none.
Следующие n столбцов соответствуют выходным переменным, т.е. задают ТО-часть правил. Элементы этих столбцов содержат порядковые номера термов, используемых для лингвистической оценки соответствующих выходных переменных.
Предпоследний столбец матрицы содержит весовые коэффициенты правил. Значения весовых коэффициентов должны быть в диапазоне [0, 1].
Последний столбец матрицы задает логические связки между переменными внутри правил. Значение 1 соответствует логической операции И, а значение 2 – логической операции ИЛИ.
Пример.
FIS_name=addrule(FIS_name, [1 1 1 1 1; 1 2 2 0.5 1])
Строка добавляет в базу знаний системы FIS_name два правила, которые интерпретируются следующим образом:
Если вход1=MF1 и вход2=MF1, то выход1=MF1 с весом 1,
Если вход1=MF1 и вход2=MF2, то выход1=MF2 с весом 0.5,
где MF1 (MF2) – терм с порядковым номером 1 (2).
Пример построения системы нечеткого вывода по дереву решений
X = load('27.SPECT.data');% чтение исходных данных
obCnt = round(size(X,1)/2); % Длина обучающей выборки
tsCnt=size(X,1)-obCnt;% Длина тестирующей выборки
Yob = X(1:obCnt, size(X,2))+1;%Классифицирующий признак обучающей выборки
Xob = X(1:obCnt, 1:(size(X,2)-1));%Признаки обучающей выборки; нормализованы
Yts = X(obCnt + 1 : size(X,1), size(X,2))+1;%Классифицирующий признак тестирующей выборки
Xts = X(obCnt + 1 : size(X,1), 1:(size(X,2)-1));%Признаки тестирующей выборки; нормализованы
T = treefit(Xob,Yob, 'method', 'classification');%Построение дерева классификации
[c,s,n,best] = treetest(T,'cross',Xob,Yob,'treesize','se');%Подсчет ошибки
tmin = treeprune(T,'level',best);%Построение дерева минимальной стоимости
treedisp(tmin);% Вывод дерева минимальной стоимости
YobTreeValp = treeval(T, Xob);% Вычисление значений обучающей выборки по дереву
YtsTreeValp = treeval(T, Xts);% Вычисление значений тестирующей выборки по дереву
YobTreeVal = treeval(tmin, Xob);% Вычисление значений обучающей выборки по дереву минимальной стоимости
YtsTreeVal = treeval(tmin, Xts);% Вычисление значений контролирующей выборки по дереву минимальной стоимости
obTreeEqp = find(YobTreeValp == Yob);%Поиск совпадений значений по дереву и по исходным данным (обучающие)
tsTreeEqp = find(YtsTreeValp == Yts);%Поиск совпадений значений по дереву и по исходным данным (тестирующие)
obTreeEq = find(YobTreeVal == Yob);%Поиск совпадений значений по минимальному дереву и по исходным данным (обучающие)
tsTreeEq = find(YtsTreeVal == Yts);%Поиск совпадений значений по минимальному дереву и по исходным данным (контролирующие)
%Вывод качества классификации по дереву
size(obTreeEq,1)/obCnt
size(obTreeEqp,1)/obCnt
size(tsTreeEq,1)/tsCnt
size(tsTreeEqp,1)/tsCnt
fis = newfis('spect.fis','sugeno');%Создание системы нечеткого вывода
fis = addvar(fis, 'input', 'x14', [0 1]);%Добавление входных и выходеых переменных, их термов и правил
fis = addmf(fis,'input',1,'low','trimf',[0 0.25 0.5]);
fis = addmf(fis,'input',1,'high','trimf',[0.5 0.75 1]);
fis = addvar(fis, 'output', 'out', [ 1 2]);
fis = addmf(fis,'output',1,'klass1','constant',1);
fis = addmf(fis,'output',1,'klass2','constant',2);
ruleList=[
1 1 1 1;
2 2 1 1;
];
fis = addrule(fis, ruleList);
%Вывод системы нечеткого вывода
plotfis(fis);
%Получение входных данных, участвующих в системе нечеткого вывода
Xob14=Xob(:,14);
Xts14=Xts(:,14);
%Вычисление значений по системе нечеткого вывожа
YobFuzVal = evalfis(Xob14, fis)
YtsFuzVal = evalfis(Xts14, fis)
YobFuzVal = round(YobFuzVal);
YtsFuzVal = round(YtsFuzVal);
%Подсчет совпадений результатов по системе нечеткого вывода и по исходным
%данным
obFuzEq = find(YobFuzVal == Yob);
tsFuzEq = find(YtsFuzVal == Yts);
%Запись системы нечеткого вывода в файл
writefis(fis,'spect.fis');
strcat('Fuzzy обучающая =', 32, int2str(size(obFuzEq, 1)/obCnt))
strcat('Fuzzy тестовая =', 32, int2str(size(tsFuzEq, 1)/tsCnt))
