估计循环布尔变量的变化
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)。
我们有一个布尔变量 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)。