如何在matlab的anfis.m中获得隶属函数的训练范围?

如何在matlab的anfis.m中获得隶属函数的训练范围?,matlab,machine-learning,fuzzy-logic,Matlab,Machine Learning,Fuzzy Logic,我需要在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','gbellm

我需要在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
-th输入的
j
-th成员函数的所有参数:

fis.input(i).mf(j).params
在下面的示例中,我为Iris数据训练了fis,该数据有4个输入。然后,我使用存储在fismat中的数据绘制所有成员函数:

close all; clc; clear variable;
%% import iris data
[x, t] = iris_dataset;
y = t(1, :)*1 + t(1, :)*2 + t(3, :)*3;
data = [x' y'];
%% train fis moddel
numMFs = [3 3 3 3];
mfType = char('gbellmf','gbellmf', 'gbellmf', 'gbellmf');
fismat = genfis1(data,numMFs,mfType);

%% plot input membership function using 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);

%% plot input membership function manually, using fismat object
figure;
% get number of inputs
ni = numel(fismat.input);
for i=1:ni
    % get total range of all mem-funs of i-th input
    range = fismat.input(i).range; 
    subplot(2, 2, i);
    xlabel(['input ' num2str(i)]);
    xlim(range); hold on;
    x = linspace(range(1), range(2), 100);
    % get number of mem-funs of i-th input
    nmf = numel(fismat.input(i).mf);
    for j=1:nmf
        % get j-th mem-fun of i-th input
        mf = str2func(fismat.input(i).mf(j).type);
        % get parameters of j-th mem-fun of i-th input
        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

谢谢你的回答。不过我有个问题。假设在我的代码中,我在anfis行之前使用一次fis手动绘图算法,而不是fismat,在anfis行之后使用一次trainedfis,而不是fismat。我得到了完全相同的形状和范围。训练后不是应该显示不同的范围吗?或者培训是在genfis1中进行的?那么anfis做什么呢?@aminrahman两件不同的事情:1-fis模型在你调用
anfis
重新训练后会改变。在“我的代码”中找到
“%.1f”,
,并将其更改为例如
”%.4f,
,然后重试。它将提高精度,您将看到参数实际上发生了变化。然而:2参数可能不会有太大的变化,所以成员函数在视觉上看起来是不变的。这是因为您在使用与以前相同的数据进行再培训,这就像是将历次次数翻倍一样。例如,要查看再培训的效果,您可以先用一半数据调用
genfis1
,然后用另一半数据调用
anfis
。是的,谢谢。使用您的方法,范围开始改变。