我们有一个布尔变量X,它是true或false,并在每个时间步骤以概率p交替。即如果p为0.2,则X将平均每5个步骤交替一次。我们还有一个时间线,并在各种非均匀采样时间点观察该变量的值。
如何从观察中学习t + n时间步长之后的概率,其中t是观察时间X并且n是将来某个时间X在t + n处交替/改变值的概率给定p是未知的,我们以前只观察过X值?请注意,我计算从true更改为false,然后再次更改为true,两次更改值。
答案 0 :(得分:1)
我将要解决这个问题,就好像它正在进行测试一样。
首先,让我们命名变量。
Bx
是x
翻转机会后的布尔变量的值(并且B0
是初始状态)。 P
是每次机会都可以换成不同价值的机会。
鉴于每个翻转机会与其他翻转机会无关(例如,翻转之间没有最小机会数),数学非常简单;由于事件不受过去事件的影响,我们可以将它们合并为单个计算,当将Bx
视为布尔值时,该算法效果最佳,但本身就是概率。
以下是我们将使用的计算域:Bx
是表示真实可能性的概率(值介于0和1之间)。 P
是一个概率(值介于0和1之间),表示在任何给定机会下翻转的可能性。
虚假的概率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;
}
Here is that code on ideone (the answer for P=0.2
and B0=1
and x=8
is B8=0.508398
)。正如您所期望的那样,随着越来越多的机会通过,价值变得越来越不可预测,最终的概率将接近Bx=0.5
。如果您的翻转机会很高(例如,使用P=0.8
,则序列的开头为B={1.0, 0.2, 0.68, 0.392, 0.46112, ...}
,您还会观察到越来越不可能出现的振荡。(<1}}。
要获得适用于更复杂方案的更完整的解决方案,请考虑使用stochastic matrix (page 7 has an example)。