4

たとえば、X が発生する可能性を表す P(x1...n) 個の離散的な独立した確率値を指定しました。

質問の普遍的なコードが必要です: X が同時に 0 回から n 回発生する確率はどれくらいですか?

例: 与えられた: 各車 (A、B、C) が駐車する 3 つの確率 P(A)、P(B)、P(C)。質問は次のとおりです: 車が 1 台も駐車しない、1 台が駐車する、2 台が駐車する、3 台が駐車する確率はどれくらいですか?

たとえば、同時に 2 台の車を駐車する場合の答えは次のようになります。

P(A,B,~C) = P(A)*P(B)*(1-P(C))
P(A,~B,C) = P(A)*(1-P(B))*P(C)
P(~A,B,C) = (1-P(A))*P(B)*P(C)
P(2 of 3) = P(A,B,~C) + P(A,~B,C) + P(~A,B,C)

私はすべての可能性についてコードを書きましたが、より多くの値を取得すると、可能な組み合わせが増えるため、もちろん遅くなります。

% probability: Vector with probabilities P1, P2, ... PN
% result: Vector with results as stated above.

% All possibilities:
result(1) = prod(probability);


shift_vector = zeros(anzahl_werte,1);
for i = 1:anzahl_werte
    % Shift Vector allocallization
    shift_vector(i) = 1;
    % Compute all unique permutations of the shift_vector
    mult_vectors = uperm(shift_vector);

    % Init Result Vector
    prob_vector = zeros(length(mult_vectors(:,1)), 1);

    % Calc Single Probabilities
    for k = 1:length(mult_vectors(:,1))
        prob_vector(k) = prod(abs(mult_vectors(k,:)'-probability));
    end

    % Sum of this Vector for one probability.
    result(i+1) = sum(prob_vector);
end



end


%%%%% Calculate Permutations
function p = uperm(a)
[u, ~, J] = unique(a);
p = u(up(J, length(a)));
end % uperm

function p = up(J, n)
ktab = histc(J,1:max(J));
l = n;
p = zeros(1, n);
s = 1;
for i=1:length(ktab)
    k = ktab(i);
    c = nchoosek(1:l, k);
    m = size(c,1);
    [t, ~] = find(~p.');
    t = reshape(t, [], s);
    c = t(c,:)';
    s = s*m;
    r = repmat((1:s)',[1 k]);
    q = accumarray([r(:) c(:)], i, [s n]);
    p = repmat(p, [m 1]) + q;
    l = l - k;
end
end
%%%%% Calculate Permutations End

この関数を高速化する方法を知っている人はいますか? それとも、Matlab にその機能が実装されているのでしょうか。


計算の名前を見つけました: ポアソン二項分布

4

1 に答える 1

5

これはどう?

probability = [.3 .2 .4 .7];

n = numel(probability);
combs = dec2bin(0:2^n-1).'-'0'; %'// each column is a combination of n values,
%// where each value is either 0 or 1. A 1 value will represent an event
%// that happens; a 0 value will represent an event that doesn't happen.
result = NaN(1,n+1); %// preallocate
for k = 0:n; %// number of events that happen
    ind = sum(combs,1)==k; %// combinations with exactly k 1's
    result(k+1) = sum(prod(...
        bsxfun(@times, probability(:), combs(:,ind)) + ... %// events that happen
        bsxfun(@times, 1-probability(:), ~combs(:,ind)) )); %// don't happen
end
于 2014-04-23T14:58:05.900 に答える