列举所有可能的决策规则

时间:2017-02-03 16:12:18

标签: matlab matrix decision-tree markov-chains bayesian-networks

我有m个输入变量I_1, ..., I_m来决定。每个变量可能有n个可能的值。决策结果D是二进制的。

决策规则R是从集合D x I_1 x ... x I_m到集合{0, 1}的映射,因此对于任何(i_1, ..., i_m) in I_1 x ... x I_m,它都拥有1 = sum_(d in D) R(d, i_1, ..., i_m)。即:对于任何输入值组合,只能做出一个决定。

例如,如果没有任何输入变量,您有两个决策规则:

D   R1   R2
a    0    1
b    1    0

R1选择b时,R2选择决定a

使用一个二进制输入变量I,您有四个可能的决策规则:

I   D   R1   R2   R3   R4
0   a    0    0    1    1
0   b    1    1    0    0
1   a    0    1    0    1
1   b    1    0    1    0

如果输入为R2,那么决策规则b会选择0,如果输入为a,则会选择1

使用两个二进制输入变量IK,您有16个可能的决策规则

I    K    D    R1   R2   R3   R4   R5   R6   R7   R8   R9   R10  R11  R12  R13  R14  R15  R16
0    0    a    0    0    0    0    0    0    0    0    1    1    1    1    1    1    1    1
0    0    b    1    1    1    1    1    1    1    1    0    0    0    0    0    0    0    0
1    0    a    0    0    0    0    1    1    1    1    0    0    0    0    1    1    1    1
1    0    b    1    1    1    1    0    0    0    0    1    1    1    1    0    0    0    0
0    1    a    0    0    1    1    0    0    1    1    0    0    1    1    0    0    1    1
0    1    b    1    1    0    0    1    1    0    0    1    1    0    0    1    1    0    0
1    1    a    0    1    0    1    0    1    0    1    0    1    0    1    0    1    0    1
1    1    b    1    0    1    0    1    0    1    0    1    0    1    0    1    0    1    0

我的问题如何为任意一组输入变量枚举所有可能的决策规则?

免责声明:这是家庭作业的一部分。然而,作业仅限于具有一个二进制输入变量的情况,使得人们可以简单地枚举所有四种情况。我通过了这部分作业 - 实际上根本没有必要进行枚举 - 但我对matlab中的一般解决方案很感兴趣。

1 个答案:

答案 0 :(得分:1)

  

如何枚举所有可能的决策规则   任意一组输入变量?

首先分析和理解在我们根据数字(n写下决策规则(R)的二进制permutations时可见的重复模式 )输入变量(V)。然后构建一个自动生成这些排列的集合函数,并显示一个包含结果的表格,就像您手工完成一样。

在代码方面,有许多不同的有效方法可以解决这个问题,但从我的角度来看,我认为使用逻辑矩阵是一种很好的方法。我将调用此矩阵(M)。该矩阵有三个部分(如说明中的表格):

  1. 左:输入变量的n列(V)
  2. 中心:1列,用于决定(D)
  3. 右:2^(2^n)列,用于决策规则(R)
  4. 既然你的问题有两个决定(A和B),我们也可以将它们视为逻辑值:

    • A = 0
    • B = 1

    注意:我为A和B选择了这个值,而不是相反的值,因为它允许我们生成二进制排列(我将调用" 状态"输入变量(V)和决策(D)使用自然二进制计数。

    对于n = 0M看起来像是:

    0   0   1
    1   1   0
    

    对于n = 1M看起来像是:

    0   0   0   0   1   1
    0   1   1   1   0   0
    1   0   0   1   0   1
    1   1   1   0   1   0
    

    对于n = 2M看起来像是:

    0   0   0   0   0   0   0   0   0   0   0   1   1   1   1   1   1   1   1
    0   0   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0
    0   1   0   0   0   0   0   1   1   1   1   0   0   0   0   1   1   1   1
    0   1   1   1   1   1   1   0   0   0   0   1   1   1   1   0   0   0   0
    1   0   0   0   0   1   1   0   0   1   1   0   0   1   1   0   0   1   1
    1   0   1   1   1   0   0   1   1   0   0   1   1   0   0   1   1   0   0
    1   1   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1
    1   1   1   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0
    

    如你所说,M的大小很快就会增长:

    • 行(" ")以2^(n + 1)
    • 的速度增长
    • 列的增长率为(n + 1) + 2^(2^n)n列,用于输入变量+ 1列,用于决策(D)+ 2^(2^n)列,用于决策规则(R)。

    从之前的矩阵中我们几乎无法区分任何重复模式,但如果我们使用颜色,我们可以清楚地看到决策规则(R)区域中的某些模式:

    n = 0

    M for n = 0

    n = 1

    M for n = 1

    n = 2

    M for n = 2

    我们可以看到有相同" 单元格式"的行方式副本。 (盒装数字)。每个" 单元模式"是2行宽和2^(2^n)/k列宽(其中k是每两行模式的重复次数)。 M中的第一个模式始终是一个副本(k = 1),k每两行重复一次。

    我们将使用所有这些信息来创建一组函数,这些函数允许我们通过使用table来调用所有可能的决策规则,我将调用它(T)。

    我编写了一个名为CalcParams的函数,它根据M计算问题的所有必要参数(例如n的行数和列数等):

    function[a, b, c, d, e] = CalcParams(n)
    % Calculate necessary parameters.
    % Inputs:
    % n - number of input variables.
    
    % Number of states (rows).
    a = 2^(n + 1);
    % Number of decision rules (R) (decision rules columns).
    b = 2^(2^n);
    % Column index of first decision rule (R1).
    c = n + 2;
    % Number of columns of input variables (V) and decision (D).
    d = n + 1;
    % Total number of columns.
    e = d + b;
    end
    

    然后我编写了一个名为ValidDecRules的函数,它给出了nM,检查输入决策规则是否符合要求:

      

    对于输入变量的任何组合,只能做出一个决定。

    如果决策规则符合要求,则函数返回1并显示消息VALID decision rules,否则函数返回0并显示消息INVALID decision rules

    function[val] = ValidDecRules(n, M)
    % This function checks if the input decision rules meet the requirement:
    % For any combination of input variables only one decision is possible.
    % Inputs:
    % n - number of input variables.
    % M - binary matrix.
    
    % Calculate necessary parameters.
    [~, ~, c, ~, e] = CalcParams(n);
    
    % Invalid decision rules by default.
    val = 0;
    % Extract odd rows from decision rules (R).
    M_odd = M(1:2:end, c:e);
    % Extract even rows from decision rules (R).
    M_even = M(2:2:end, c:e);
    
    % Check that all elements of the odd rows are different than the elements
    % of the even rows.
    if(all(all(M_odd ~= M_even, 1), 2))
        % Valid decision rules.
        val = 1;
        disp('VALID decision rules');
    else
        % Invalid decision rules.
        disp('INVALID decision rules');
    end
    
    end
    

    然后我编写了一个名为GenM的函数,它根据M生成二进制矩阵n,如果使用可选参数'plot',它将绘制决策规则M使用imagesc

    function[M] = GenM(n, varargin)
    % This function generates the binary matrix M.
    % Inputs:
    % n - number of input variables.
    % Options:
    % 'plot' - plot decision rules of M.
    
    % Calculate necessary parameters.
    [a, b, c, d, e] = CalcParams(n);
    
    % Anonymous functions.
    f1 = @(v, k) uint8(repmat(v, 1, k));
    f2 = @(v, k) f1([v; ~v], k);
    f3 = @(b, k) f2([false(1, b/(2*k)), ~false(1, b/(2*k))], k);
    
    % Binary permutations of input variables (V) and decision (D).
    Dec = 0:a-1; % Array: decimal representation of every state.
    Bin = dec2bin(Dec); % Array: binary representation of every state.
    
    % Preallocate matrix M.
    M(length(Bin), d) = 0;
    
    % Loop: input variables (V) and decision (D).
    % Writes binary states in matrix M.
    for i = 1:d
        M(:, i) = uint8(str2num(Bin(:, i)));
    end
    
    % Loop: decision rules.
    % Writes binary permutations of decision rules (R) in matrix (M).
    % Start with k = 1.
    k = 1;
    for i = 1:2:a
        M(i:(i + 1), c:e) = f3(b, k);
        k = k*2;
    end
    
    % Continue only if decision rules (R) are valid.
    if(ValidDecRules(n, M))
        % Plot decision rules if 'plot' option is used.
        if(~isempty(varargin))
            if(any(strcmp(varargin, 'plot')))
                % Visualize decision rules as image.
                imagesc(M(:, c:e));
                title('Decision Rules (R)');
                colormap summer;
                axis off;
            end
        end
    else
        % If decision rules are invalid, return empty output.
        M = [];
    end
    
    end
    

    最后,我编写了一个名为EnumDecRules的函数,该函数使用n并生成一个表T,与您问题描述中的表格非常相似。该函数还返回用于生成M的二进制矩阵T。如果您使用'plot'可选参数,它将绘制M的决策规则(如GenM函数)。

    EnumDecRules函数是真正回答您问题的函数,因为它具有您要求的行为。

    function[T, M] = EnumDecRules(n, varargin)
    % This function generates the table (T) with the results and also returns
    % the binary matrix M that was used to generate T.
    % Inputs:
    % n - number of input variables.
    % Options:
    % 'plot' - plot decision rules of M.
    
    % Calculate necessary parameters.
    [a, ~, ~, d, e] = CalcParams(n);
    
    % Generate the binary matrix M.
    M = GenM(n, varargin{:});
    
    if(~isempty(M))
        % Loop: variable names to diplay in table header.
        % Initialize indexes for numbering.
        Vi = 1; % Input variable numbering index.
        Ri = 1; % Decision rules numbering index.
        for i = 1:e
            if i <= n
                % Input variables.
                % Write V[Vi].
                Names{i} = ['V', sprintf('%d', Vi)];
                % Increase index.
                Vi = Vi + 1;
            elseif i == d
                % Decision.
                % Write D.
                Names{i} = 'D';
            elseif i > d
                % Decision rules.
                % Write R[Ri].
                Names{i} = ['R', sprintf('%d', Ri)];
                % Increase index.
                Ri = Ri + 1;
            end
        end
    
        % Generate table with results.
        T = array2table(M, ...
            'VariableNames', Names);
    
        % Modify decision column (D) of table.
        % Replace 0 with 'A'.
        % Replace 1 with 'B'.
        T.D = repmat({'A'; 'B'}, a/2, 1);
    else
        % If M is empty, return empty output.
        T = [];
    end
    
    end
    

    用法示例:

      

    确保将所有功能正确保存在同一目录中。

    示例1:

    调用EnumDecRules函数枚举n = 1的所有可能决策规则:

    [T, M] = EnumDecRules(1)
    

    这些是输出:

    VALID decision rules
    T = 
        V1     D     R1    R2    R3    R4
        __    ___    __    __    __    __
        0     'A'    0     0     1     1 
        0     'B'    1     1     0     0 
        1     'A'    0     1     0     1 
        1     'B'    1     0     1     0 
    M =
         0     0     0     0     1     1
         0     1     1     1     0     0
         1     0     0     1     0     1
         1     1     1     0     1     0
    

    示例2:

    调用EnumDecRules函数枚举n = 2的所有可能决策规则,并绘制决策规则:

    [T, M] = EnumDecRules(2, 'plot')
    

    这些是输出:

    VALID decision rules
    T = 
        V1    V2     D     R1    R2    R3    R4    R5    R6    R7    R8    R9    R10    R11    R12    R13    R14    R15    R16
        __    __    ___    __    __    __    __    __    __    __    __    __    ___    ___    ___    ___    ___    ___    ___
        0     0     'A'    0     0     0     0     0     0     0     0     1     1      1      1      1      1      1      1  
        0     0     'B'    1     1     1     1     1     1     1     1     0     0      0      0      0      0      0      0  
        0     1     'A'    0     0     0     0     1     1     1     1     0     0      0      0      1      1      1      1  
        0     1     'B'    1     1     1     1     0     0     0     0     1     1      1      1      0      0      0      0  
        1     0     'A'    0     0     1     1     0     0     1     1     0     0      1      1      0      0      1      1  
        1     0     'B'    1     1     0     0     1     1     0     0     1     1      0      0      1      1      0      0  
        1     1     'A'    0     1     0     1     0     1     0     1     0     1      0      1      0      1      0      1  
        1     1     'B'    1     0     1     0     1     0     1     0     1     0      1      0      1      0      1      0  
    M =
      Columns 1 through 9
         0     0     0     0     0     0     0     0     0
         0     0     1     1     1     1     1     1     1
         0     1     0     0     0     0     0     1     1
         0     1     1     1     1     1     1     0     0
         1     0     0     0     0     1     1     0     0
         1     0     1     1     1     0     0     1     1
         1     1     0     0     1     0     1     0     1
         1     1     1     1     0     1     0     1     0
      Columns 10 through 18
         0     0     1     1     1     1     1     1     1
         1     1     0     0     0     0     0     0     0
         1     1     0     0     0     0     1     1     1
         0     0     1     1     1     1     0     0     0
         1     1     0     0     1     1     0     0     1
         0     0     1     1     0     0     1     1     0
         0     1     0     1     0     1     0     1     0
         1     0     1     0     1     0     1     0     1
      Column 19
         1
         0
         1
         0
         1
         0
         1
         0
    

    情节:

    Plot of the decision rules of M for n = 2

    由于此类算法增长如此之快,因此EnumDecRules使用GenMn >= 5会导致内存不足错误。

    我真的希望这会有所帮助。如果您对代码的具体说明有任何疑问,请发表评论,我很乐意回答。