MATLAB。计算项目集

时间:2014-03-18 11:21:17

标签: matlab grouping combinations combinatorics

假设m×n矩阵A向我们提供有关在n个项目可用的市场中购买m个客户的信息。 给定一个二元矩阵,例如A,它给我们第i个购买中第j个项目的存在(或不存在)。

A = [1 0 0 1 0 1 ... 0;       0 1 0 1 0 0 ... 1;       。       。       。       1 0 0 1 0 0 ... 0]

我想知道有多少客户购买了商品{{1},{1,2},{1,2,3} ......等等。

如何在MATLAB中有效地完成这项工作? 我还没有开始这个。

3 个答案:

答案 0 :(得分:2)

从此代码中可以找到已购买商品{{1},{1,2},{1,2,3} ......等的客户数

A = round(rand(5,10))

count = zeros(1,size(A,2));
count(1) = sum(A(:,1));
for k =2:size(A,2)
    count(k) = nnz(ismember(A(:,1:k),repmat(1,1,k),'rows'));
end

示例运行:

A =

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


count =

     2     1     1     0     0     0     0     0     0     0

因此,对于此示例,我们有5个客户和10个项目。计数2,1,1和0分别代表购买item1,items1 + 2,items1 + 2 + 3和items1 + 2 + 3 + 4的人数。

编辑1 如果您希望查找所有可能的项目组合的人数,请尝试使用此代码

%%// Data
A = round(rand(5,4));
count = zeros(1,size(A,2));
count(1) = sum(A(:,1));

%%// Get the counts
combs = cell(1,size(A,2));
combs_counts = cell(1,size(A,2));
for k=1:size(A,2)

    c1 = combnk(1:size(A,2),k);
    combs(k) = {c1};

    counts = zeros(size(c1,1),1);
    for k2 = 1:size(c1,1)
        m1 = A(:,c1(k2,:));
        counts(k2) = nnz(ismember(m1,repmat(1,1,k),'rows'));
    end

    combs_counts(k) = {counts};
end

%% Testing: Let us check for all possible combinations with two items by printing the values
item_count = 2;

A
cell2mat(combs(item_count))
cell2mat(combs_counts(item_count))

示例运行提供

A =

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


ans =

     3     4
     2     4
     2     3
     1     4
     1     3
     1     2


ans =

     0
     0
     1
     0
     4
     1

因此,我们可以看到2作为项目数量,我们有6个可能的组合,它们列在单元格数组combs中,并且每个组合都包含客户列在另一个单元格数组combs_counts中。

答案 1 :(得分:1)

    ItemsTot=sum(A,1)          % total of purchase for each item

    for k=2:n
        itemsNum=combnk(1:n,k) % possible combinations
        Cnline=size(C,1);    % = nchoosek(n,k);
        purchaseTot=sum(ItemsTot(itemsNum),2)
    end

编辑:我认为您想要购买第1项和第2项的总数...而不是购买1和2的客户数量:p

这里的代码可以满足您的需求,但理解起来却非常复杂......

    %% data
    m=5;                %m customer
    n=4;                %n items
    A = round(rand(m,n)) % matrix of purchase (filled randomly)

    ItemComb=de2bi((1:2^n-1))

    B=ItemComb./(ItemComb*ones(n,n));

    Result=sum(A*B'==1,1)

答案 2 :(得分:0)

可以非常简单地解决

sum(cumprod(A,2))