第一次在这里发帖,所以如果我弄错了某些东西让我知道,我会非常乐意解决它!
给定N个事件,每个事件都有一个发生的个体概率(从0到100%),我想确定一起发生的那些事件的0到N的概率。
例如,如果我有事件1,2,3,...,N和5(E1,E2,E3 ......,EN),其中特定事件发生的个别概率如下:
E3 =发生概率为50%
...
EN = x%发生概率
我想知道拥有的可能性:
据我所知,发生0事件的是(1-E1)(1-E2)...(1-EN),并且发生所有N个事件的是E1 * E2 * ... * E3。但是,我不知道如何计算其他可能性(1到N-1事件发生)。
我一直在寻找一些可以解决这个问题的递归算法(二项式化合物分布),但我没有找到任何明确的公式来做到这一点。想知道你们有没有人可以提供帮助!
提前致谢!
编辑:事件确实独立。
答案 0 :(得分:1)
答案 1 :(得分:0)
您需要计算自己的Pascal三角形版本,并在每个位置计算概率(而不是计数)。第0行将是单个数字1.00;第1行由两个值组成,P(E1)和1-P(E1)。在其下方,在行k中,每个位置是P(Ek) [右上方输入] +(1-P(Ek)) [左上方输入]。我建议使用一个低三角矩阵,如:
1.00
0.30 0.70
0.12 0.46 0.42 # These are 0.3*0.4 | 0.3*0.6 + 0.7*0.4 | 0.7*0.6
0.06 0.29 0.44 0.21 # 0.12*0.5 | 0.12*0.5 + 0.46*0.5 | ...
看看它是如何工作的?在矩阵M的数组/矩阵表示法中,给定了向量P中的事件概率,这看起来像
M[k, i] = P[k] * M[k-1, i] +
(1-P[k]) * M[k-1, i] + P[k] * M[k-1, i-1]
以上是一个很好的递归定义。请注意我之前的"右上角"下矩阵表示法中的引用只是上面的一行;左上角恰好是:行k-1,列i-1。
当你完成时,矩阵的底行将是获得事件的N,N-1,N-2,... 0的概率。如果你想要这些概率的相反顺序,那么只需切换系数P [k]和1-P [k]
这会让你走向解决方案吗?
答案 2 :(得分:0)
以下递归程序应该可以正常工作。
function ans = probability_vector(probabilities)
if len(probabilities) == 0
% No events can happen.
ans = [1];
elseif len(probabilities) == 1
% 0 or 1 events can happen.
ans = [1 - probabilities[1], probabilities[1]];
else
half = ceil(len(probabilities)/2);
ans_half1 = probability_vector(probabilities[1: half]);
ans_half2 = probability_vector(probabilities[half + 1: end]);
ans = convolve(ans_half1, ans_half2)
end
return
end
如果p
是概率向量,则p[i+1]
是事件发生i
的概率。
请参阅http://matlabtricks.com/post-3/the-basics-of-convolution,了解执行工作的神奇conv
运算符。
答案 3 :(得分:0)
经过大量的研究和这里的答案的一些帮助,我想出了以下代码:
function [ prob_numSites ] = probability_activationSite( prob_distribution_site )
N = length(prob_distribution_site); % number of events
notProb = 1 - prob_distribution_site; % find probability of no occurrence
syms x; % create symbolic variable
prob_number = 1; % initializing prob_number to 1
for i = 1:N
prob_number = prob_number*(prob_distribution_site(i)*x + notProb(i));
end
prob_number_polynomial = expand(prob_number); % expands the function into a polynomial
revProb_numSites = coeffs(prob_number_polynomial); % returns the coefficients of the above polynomial (ie probability of 0 to N events, where first coefficient is N events occurring, last coefficient is 0 events occurring)
prob_numSites = fliplr(revProb_numSites); % reverses order of coefficients
这会产生一定数量的单个事件发生的概率,并返回0到N事件发生概率的数组。
(This回答很多)。
答案 4 :(得分:0)
这些答案似乎都不起作用/对我来说是可以理解的,因此我对其进行了计算并使用python自行编写:
def combin(n, k):
if k > n//2:
k = n-k
x = 1
y = 1
i = n-k+1
while i <= n:
x = (x*i)//y
y += 1
i += 1
return x
# proba being the probability of each of the N evenments, each being different from one another.
for i in range(N,0,-1):
print(i)
if sums[i]> 0:
continue
print(combin(N,i))
for j in itertools.combinations(proba, i):
sums[i]+=np.prod(j)
for i in range(N,0,-1):
for j in range(i+1,N+1):
icomb = combin(j,i)
sums[str(i)] -= icomb*sums[str(j)]
数学并不简单:
让$ C_ {w_n} $为所有无序集合$(i,j,k ... n)$ 的集合
其中$ i,j,k ... n \ in w $
$ Co(i,proba)= sum {C_ {w_i}}-sum_ {u from i + 1..n} {(u \ choose i) sum {C_ {w_u} }} $ *
$ Co(i,P)$是在给定$ P = {p_i ... p_n} $(每个事件的伯努利概率)的情况下发生i个事件的概率。