假设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中有效地完成这项工作? 我还没有开始这个。
答案 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))