www.gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzzy/genparam.m

    function mf_param = genparam(data,mf_n,mf_type)
%GENPARAM Generate initial membership function parameters for ANFIS learning.
%   GENPARAM(DATA,MF_N,MF_TYPE) generates initial input MF parameters
%   from a M-by-N training data matrix DATA, where M is the number of
%   training data pairs and N is the number of inputs plus one.
%   MF_N and MF_TYPE are optional arguments that specify the MF
%   number and MF type of each input, respectively. MF_N should be a
%   vector of length N. If MF_N is a number, then it applies to all inputs.
%   Similarly, MF_TYPE should be a string matrix of N rows. If MF_TYPE is a
%   single string, it applies to all inputs. Default values for MF_N and
%   MF_TYPE are 2 and 'gbellmf', respectively.
%
%   The centers of the generated MFs are always equally spaced along the
%   domain of an input variable, where the domain is determined as the
%   interval between the min. and max. of the corresponding column in DATA.
%
%   Restrictions: (1) 'sigmf', 'smf', and 'zmf' MF types are not supported
%   since they are either open-left or open-right. (2) The same MF type
%   is assigned to MFs of the same input variable.
%
%   For example:
%
%       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
%
%   See also GENFIS1, ANFIS.

%       Roger Jang, 8-7-94
%   Copyright 1994-2002 The MathWorks, Inc. 
%   $Revision: 1.14 $  $Date: 2002/04/14 22:19:43 $

% Change this to have different default values
default_mf_n = 2;
default_mf_type = 'gbellmf';

if nargin <= 2,
    mf_type = default_mf_type;
end
if nargin <= 1,
    mf_n = default_mf_n;
end

% get dimension info
data_n = size(data, 1);
in_n = size(data, 2) - 1;
range = [min(data)' max(data)'];

% generate mf_n and mf_type of proper sizes
if length(mf_n) == 1,
    mf_n = mf_n(ones(in_n, 1), :);
end
if size(mf_type, 1) == 1,   % single mf_type for all MFs
    mf_type = mf_type(ones(in_n, 1), :);
end

% error checking
if length(mf_n) ~= in_n | size(mf_type, 1) ~= in_n,
    error('Wrong sizes of given argument(s)!');
end

mf_param = [];
for i = 1:in_n;
    type = deblank(mf_type(i, :));
    if strcmp(type, 'gbellmf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        b = 2;
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        d = zeros(mf_n(i), 1);
        mf_param = [mf_param; 
            a(ones(mf_n(i), 1)) b(ones(mf_n(i), 1)) c d];
    elseif strcmp(type, 'gaussmf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        a = a/sqrt(2*log(2));
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        d = zeros(mf_n(i), 1);
        mf_param = [mf_param; a(ones(mf_n(i), 1)) c d d];
    elseif strcmp(type, 'gauss2mf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        c1 = c - 0.6*a;
        c2 = c + 0.6*a;
        sigma = 0.4*a/sqrt(2*log(2))*ones(mf_n(i), 1); 
        mf_param = [mf_param; sigma c1 sigma c2];
    elseif strcmp(type, 'dsigmf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        tmp = 10/(range(i,2) - range(i, 1))*mf_n(i)*ones(mf_n(i), 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        mf_param = [mf_param; tmp c-a tmp c+a];
    elseif strcmp(type, 'psigmf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        tmp = 10/(range(i,2) - range(i, 1))*mf_n(i)*ones(mf_n(i), 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        mf_param = [mf_param; tmp c-a -tmp c+a];
    elseif strcmp(type, 'trimf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        d = zeros(mf_n(i), 1);
        mf_param = [mf_param; c-2*a c c+2*a d];
    elseif strcmp(type, 'trapmf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        d = zeros(mf_n(i), 1);
        mf_param = [mf_param; c-1.4*a c-0.6*a c+0.6*a c+1.4*a];
    elseif strcmp(type, 'pimf'),
        a = (range(i,2) - range(i, 1))/2/(mf_n(i) - 1);
        c = linspace(range(i, 1), range(i, 2), mf_n(i))';
        mf_param = [mf_param; c-1.4*a c-0.6*a c+0.6*a c+1.4*a];
    else
        fprintf('mf_type = %s\n', type);
        error('Unsupported MF type!');
    end
end