估计循环布尔变量的变化

Estimating change of a cyclic boolean variable

我们有一个布尔变量 X,它要么为真要么为假,并且在每个时间步以概率 p 交替出现。 IE。如果 p 为 0.2,则 X 平均每 5 个时间步交替一次。我们还有一个时间线和在各个非均匀采样时间点对该变量值的观察。

如何从观察中获知在 t+n 时间步之后观察到的概率,其中 t 是时间 X,n 是未来某个时间 X 在 t+ 具有 alternated/changed 值n 假设 p 是未知的,我们只有以前观察到的 X 值?请注意,我将从 true 变为 false 并再次返回 true 视为两次更改值。

我将像对待测试一样来处理这个问题。

首先,我们来命名变量。

B<sub>x</sub>x 翻转机会后布尔变量的值(和 B <sub>0</sub>为初始状态)。 P 是每次机会更改为不同值的机会。

鉴于每个翻转机会与其他翻转机会无关(例如,翻转之间没有最小机会数),数学非常简单;由于事件不受过去事件的影响,我们可以将它们合并为一个计算,这在考虑 B<sub>x</sub> 时效果最好一个布尔值,但本身就是一个概率。

这是我们将使用的计算域:B<sub>x</sub> 是一个概率(值介于 0 和 1 之间,包括) 表示真实的可能性。 P 是一个概率(值介于 0 和 1 之间),表示在任何给定机会翻转的可能性。

错误的概率,1 - B<sub>x</sub>,和不翻转的概率,1 - P,是概率应该非常直观的身份。

假设这些简单的规则,布尔值的一般真实概率由递归公式 B<sub>x+1</sub> = B[=42= 给出]x</sub>*(1-P) + (1-B<sub>x</sub>)*P.

代码(在 C++ 中,因为它是我最喜欢的语言而你没有标记):

int   max_opportunities = 8;  // Total number of chances to flip.
float flip_chance = 0.2;      // Probability of flipping each opportunity.
float probability_true = 1.0; // Starting probability of truth.
                              // 1.0 is "definitely true" and 0.0 is 
                              // "definitely false", but you can extend this
                              // to situations where the initial value is not
                              // certain (say, 0.8 = 80% probably true) and
                              // it will work just as well.
for (int opportunities = 0; opportunities < max_opportunities; ++opportunities)
{
    probability_true = probability_true * (1 - flip_chance) + 
                       (1 - probability_true) * flip_chance;
}

Here is that code on ideone (the answer for P=0.2 and B<sub>0</sub>=1 and x=8 is B<sub>8</sub>=0.508398)。正如你所预料的那样,随着越来越多的机会过去,该值变得越来越不可预测,最终概率将接近 B<sub>x</sub>=0.5 .如果翻转的可能性很高(例如,使用 P=0.8,序列的开头是 B={1.0, 0.2, 0.68, 0.392, 0.46112, ...}

,您还会观察到真实可能性之间的振荡。

要获得适用于更复杂场景的更完整的解决方案,请考虑使用 stochastic matrix (page 7 has an example)