我们有一个布尔变量 X,它要么是真要么是假,并且在每个时间步以概率 p 交替。即,如果 p 为 0.2,X 将平均每 5 个时间步交替一次。我们也有一个时间线和在不同的非均匀采样时间点观察这个变量的值。
人们如何从观察中得知在 t+n 时间步之后的概率,其中 t 是观察到 X 的时间,n 是未来某个时间 X 在 t+n 处交替/改变值的概率,因为 p 是未知的并且我们只有在以前的时间观察到 X 的值吗?请注意,我将从 true 更改为 false 并再次返回 true 算作两次更改值。
我们有一个布尔变量 X,它要么是真要么是假,并且在每个时间步以概率 p 交替。即,如果 p 为 0.2,X 将平均每 5 个时间步交替一次。我们也有一个时间线和在不同的非均匀采样时间点观察这个变量的值。
人们如何从观察中得知在 t+n 时间步之后的概率,其中 t 是观察到 X 的时间,n 是未来某个时间 X 在 t+n 处交替/改变值的概率,因为 p 是未知的并且我们只有在以前的时间观察到 X 的值吗?请注意,我将从 true 更改为 false 并再次返回 true 算作两次更改值。
我将处理这个问题,就好像它是在测试一样。
首先,让我们命名变量。
Bx
x
是翻转机会后布尔变量的值(并且是初始状态)。是每一次机会改变为不同值的机会。B0
P
鉴于每个翻转机会与其他翻转机会无关(例如,翻转之间没有最小机会数),数学非常简单;由于事件不受过去事件的影响,我们可以将它们合并到一个计算中,当不将其视为布尔值而将其视为概率时,这种计算效果最好。Bx
以下是我们将使用的计算域:是表示真实可能性的概率(其值介于 0 和 1 之间)。 是一个概率(值介于 0 和 1 之间),表示在任何给定机会翻转的可能性。Bx
P
错误的概率和不翻转的概率是概率恒等式,应该非常直观。1 - Bx
1 - P
假设这些简单的规则,布尔值的一般真实概率由递归公式给出。Bx+1 = Bx*(1-P) + (1-Bx)*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;
}
这是 ideone 上的代码(P=0.2
and and is的答案)B0=1
x=8
B8=0.508398
。正如您所料,随着越来越多的机会过去,价值变得越来越不可预测,最终概率将接近。如果您翻转的机会很高(例如,对于,序列的开头是.Bx=0.5
P=0.8
B={1.0, 0.2, 0.68, 0.392, 0.46112, ...}
对于适用于更复杂场景的更完整的解决方案,请考虑使用随机矩阵(第 7 页有一个示例)。