4

数日間、MATLABでm人の専門家の加重多数決を効率的に実装する方法について考えていました。これが私が欲しいものの例です。重みベクトルを持つ3人のエキスパートがいるとします

w=[7 2 6]

オプションA/B / C / Dにn回投票していると仮定すると、たとえば、次のnxm投票マトリックスが得られます。ここで、列は各専門家の投票です。

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

さて、行数nのforループを使用したこの実装は、多かれ少なかれ簡単です。私は今、この潜在的に長いループを必要とせず、代わりにベクトル演算を使用する解決策を探しています。私はいくつかのアイデアを持っていましたが、それぞれにいくつかの問題が発生したので、ここでは言及しません。誰かが以前に同様の状況にあった場合は、あなたの解決策を共有してください。

ありがとう。

4

1 に答える 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
于 2013-03-19T12:24:27.817 に答える