我需要在MATLAB中获取anfis输入的成员函数范围。我使用以下代码训练了我的网络,并且成功地完成了训练。但我需要获取网络为输入成员函数找到的范围值。我的意思是,如果一个成员函数是钟形的,比如gbellmf
,它的公式是(x)= exp{-((x-c)/a)^(2*b)}
,我需要在网络训练后知道a
、b
和c
的值。
function trainedfis = main(data,chkdata) fis = genfis1(data,[3 3 3],char('gbellmf','gbellmf', 'gbellmf')); [trainedfis,errors,stepssize,chkfis,errchk] = anfis(data,fis,3,[1 1 1 1],chkdata); end
我的数据有三个输入和一个输出(3列为输入,1列为输出)。我使用了MATLAB内置的genfis1
和anfis
函数。
回答:
你可以通过以下方式访问第i
个输入的第j
个成员函数的所有参数:
fis.input(i).mf(j).params
在下面的例子中,我使用Iris数据训练了fis,该数据有4个输入。然后我使用fismat
中存储的数据绘制了所有成员函数:
close all; clc; clear variable;%% 导入iris数据[x, t] = iris_dataset;y = t(1, :)*1 + t(1, :)*2 + t(3, :)*3;data = [x' y'];%% 训练fis模型numMFs = [3 3 3 3];mfType = char('gbellmf','gbellmf', 'gbellmf', 'gbellmf');fismat = genfis1(data,numMFs,mfType);%% 使用plotmf绘制输入成员函数subplot(2,2,1), plotmf(fismat,'input',1);subplot(2,2,2), plotmf(fismat,'input',2);subplot(2,2,3), plotmf(fismat,'input',3);subplot(2,2,4), plotmf(fismat,'input',4);%% 使用fismat对象手动绘制输入成员函数figure;% 获取所有输入的数量ni = numel(fismat.input);for i=1:ni % 获取第i个输入的所有成员函数的总范围 range = fismat.input(i).range; subplot(2, 2, i); xlabel(['input ' num2str(i)]); xlim(range); hold on; x = linspace(range(1), range(2), 100); % 获取第i个输入的成员函数数量 nmf = numel(fismat.input(i).mf); for j=1:nmf % 获取第i个输入的第j个成员函数 mf = str2func(fismat.input(i).mf(j).type); % 获取第i个输入的第j个成员函数的参数 params = fismat.input(i).mf(j).params; y = mf(x, params); plot(x, y, 'displayname', ... [fismat.input(i).mf(j).type '(' num2str(params, '%.1f,') ')']); end legend('show')end