在MATLAB中实现高效的多类加权多数投票算法

4

几天来我一直在想如何在Matlab中高效实现m个专家的加权多数投票。以下是我想要的一个示例。假设我们有3个权重向量的专家

w=[7 2 6]

假设他们在A/B/C/D选项上投票n次,那么我们得到以下n x m的投票矩阵,其中每个专家的投票是列:
A B B
C A A
D B A
A A C

现在我想为每一行找到加权多数表决。我们通过将投票给每个选项的专家的权重相加,并选择最大权重来计算它。例如,在第一行中,选项A的累积权重为7(专家1的投票),B的累积权重为8(专家2和3的投票),因此最终投票结果是B。因此,我们得到以下累积权重矩阵和最终投票结果:

A B C D
- - - -
7 8 0 0 -> B
8 0 7 0 -> A
6 2 0 7 -> D
9 0 6 0 -> A

现在,使用 for 循环对行数 n 进行实现更加直观易懂。我正在寻找一种不需要这个可能很长的循环,而是使用向量算术运算的解决方案。我已经有了一些想法,但每个想法都遇到了一些问题,所以现在不会提及它们。如果有人之前遇到过类似的情况,请分享您的解决方案。

谢谢。


你能分享一下你是如何找到这里的权重的吗?你使用了什么方法/算法来实现这个过程? - MaxSteel
1
这真的取决于你的领域。我正在实施Kolter,J. Z.和Maloof,M. A.(2007)中描述的DWM。动态加权多数:漂移概念的集成方法。机器学习研究杂志。这是非稳态环境下在线数据分类的方法。 您可能还对以下论文感兴趣: Shapley,L.和Grofman,B。(1984)。在相互依赖存在的情况下优化群体判断准确性。 Littlestone,N.和Warmuth,M. K.(1994)。加权多数算法。信息与计算。 - shiftyscales
谢谢。我会阅读你建议的论文。 - MaxSteel
1个回答

4
w=[7 2 6];

votes = ['A' 'B' 'B'
         'C' 'A' 'A'
         'D' 'B' 'A'
         'A' 'A' 'C'];

options = ['A', 'B', 'C', 'D']';
%'//Make a cube of the options that is number of options by m by n
OPTIONS = repmat(options, [1, size(w, 2), size(votes, 1)]);

%//Compare the votes (streched to make surface) against a uniforma surface of each option
B = bsxfun(@eq, permute(votes, [3 2 1]) ,OPTIONS);

%//Find a weighted sum
W = squeeze(sum(bsxfun(@times, repmat(w, size(options, 1), 1), B), 2))'

%'//Find the options with the highest weighted sum
[xx, i] = max(W, [], 2);
options(i)

结果:

B
A
D
A

谢谢,这个很好用!有趣的是,我曾经想到过这个解决方案并实现了它,尽管没有你做得那么干净。但是在最后一步卡住了,需要逐行取最大值 :) - shiftyscales
哈哈,我差点没做最后一步!很高兴它起作用了。这会加快进程吗?下次如果你接近最终解决方案,请发布你的代码。 - Dan
1
你问它是否加快了进程?好吧,对于有4个选项和可变选民数量(还有其他一些东西,不使用循环无法完成)的10k投票,我的旧代码需要300秒。而使用你的版本,只需要13秒!所以我非常高兴花费2天时间来完成这个。顺便说一句,这是代码的一个小泛化,供任何遵循此方法的人使用 - 在行中用size(options,1)替换4,W = squeeze(sum(bsxfun(@times, repmat(w, 4, 1), B), 2))'。也许你可以编辑你的代码来包括这个,这样我就不用再添加答案了。 - shiftyscales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接