DST速成班
Dempster–Shafer理论(DST)提供了一种方法,可以将各种证据来源组合成一个信念。给定一个可能陈述的列表(其中一个是正确答案),每个可能的陈述组合都被分配一个“质量”,以表示支持证据的程度。所有组合的总质量始终等于1。
从这些大规模分配中,我们可以根据该组合的真实性创建一个合理的下限(信念)和上限(合理性)。bel(X)任何集合X 的置信度都是X的所有子集(包括自身)的质量总和。pl(X)任何集合X 的合理性是“ 1-与X不相交的所有集合的质量之和”。下图说明了信念和合理性与不确定性之间的关系。
例如,假设有一个交通信号灯可以是Green,Yellow或Red之一。选项列表和可能的质量分配如下所示:
binary interpretation m(X) bel(X) pl(x)
000 null 0 0 0
001 R 0.2 0.2 0.7
010 Y 0.1 0.1 0.3
011 Y||R 0.05 0.35 0.8
100 G 0.2 0.2 0.65
101 G||R 0.3 0.7 0.9
110 G||Y 0 0.3 0.8
111 G||Y||R 0.15 1 1
这些质量可以用数组表示[0, 0.2, 0.1, 0.05, 0.2, 0.3, 0, 0.15]。
现在的问题是,我们如何决定群众是什么?假设我们有一个传感器正在观察光,并且该传感器指示该光不是绿色。但是,我们知道传感器有20%的机会发送随机的虚假信号。该证据可以通过质量分布来描述,[0, 0, 0, 0.8, 0, 0, 0, 0.2]其中{Y,R}的质量为0.8,{G,Y,R}的质量为0.2。
同样,假设某个第二个传感器指示该灯不是红色,但我们也知道该传感器有故障的可能性为30%,而该灯实际上是红色的。可以用[0, 0.3, 0, 0, 0, 0, 0.7, 0]{G,Y}的质量为0.7,{R}的质量为0.3 来描述这一证据。
为了吸收这两个证据以形成单一质量分布,我们可以使用Dempster的组合法则。
邓普斯特的组合法则
两个质量分配m1并m2可以被组合以形成m1,2使用下面的公式,其中A,B和C表示可能的组合(上表的行)。
其中K是“冲突”的度量,用于重新规范化,并通过以下公式计算:
如下图所示,也可以用几何方式描述此过程。如果A = 011(黄色或红色)和B = 101(绿色或红色),则m1(A) * m2(B) 贡献值将添加到m1,2(001)(红色)值中。对A和B的所有可能组合重复此过程,其中A&B != 0。最后,将数组重新规格化,以使值的总和为1。
这是一个简单的Java方法,它按照Dempster的规则组合两个数组:
public static double[] combine(double[] a, double[] b) {
double[] res = new double[a.length];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
res[i & j] += a[i] * b[j];
}
}
for (int i = 1; i < res.length; i++) {
res[i] /= 1 - res[0];
}
res[0] = 0;
return res;
}
要查看其在实际中的工作原理,请考虑上面的交通信号灯传感器,它们独立地给群众[0, 0, 0, 0.8, 0, 0, 0, 0.2]和[0, 0.3, 0, 0, 0, 0, 0.7, 0]。在执行Dempster规则后,所得关节质量为[0, 0.3, 0.56, 0, 0, 0, 0.14, 0]。质量的大部分分配给“黄色”,这很直观,因为两个传感器分别返回“不是绿色”和“不是红色”。其他两个质量(“红色”为0.3,“绿色或黄色”为0.14)是由于测量的不确定性所致。
挑战
编写一个程序,该程序接受两个实数列表,并输出将Dempster规则应用于两个输入列表的结果。两个输入列表的长度将相等,并且该长度将是2的幂,并且至少应为4。对于每个列表,第一个值将始终为0,其余值都将为非负数并加最多1。
输出应为长度与输入列表相同的列表。您可以假定存在解决方案(当证据之间存在完全冲突且因此K = 1时,解决方案可能不存在)。为了对精度提出最低要求,您的程序在四舍五入到小数点后四位时必须能够产生准确的结果。
示例I / O
in:
[0, 0, 0, 0.8, 0, 0, 0, 0.2]
[0, 0.3, 0, 0, 0, 0, 0.7, 0]
out:
[0.0, 0.3, 0.56, 0.0, 0.0, 0.0, 0.14, 0.0]
in:
[0.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4]
[0.0, 0.2, 0.0, 0.2, 0.0, 0.2, 0.0, 0.4]
out:
[0.0, 0.2889, 0.0889, 0.1556, 0.0889, 0.1556, 0.0444, 0.1778]
in:
[0.0, 0.0, 0.5, 0.5]
[0.0, 0.7, 0.1, 0.2]
out:
[0.0, 0.53846, 0.30769, 0.15385]
in:
[0.0, 0.055, 0.042, 0.098, 0.0, 0.152, 0.0, 0.038, 0.031, 0.13, 0.027, 0.172, 0.016, 0.114, 0.058, 0.067]
[0.0, 0.125, 0.013, 0.001, 0.012, 0.004, 0.161, 0.037, 0.009, 0.15, 0.016, 0.047, 0.096, 0.016, 0.227, 0.086]
out: (doesn't have to be this precise)
[0.0, 0.20448589713416732, 0.11767361551134202, 0.028496524069011694, 0.11809792349331062, 0.0310457664246791, 0.041882026540181416, 0.008093533320057205, 0.12095719354780314, 0.11306959103499466, 0.06412594818690368, 0.02944697394862137, 0.06398564368086611, 0.014369896989336852, 0.03774983253978312, 0.006519633578941643]
in:
[0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.1, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.1, 0.0]
out:
[0.0, 0.09090909090909094, 0.23376623376623382, 0.0, 0.07792207792207795, 0.025974025974026, 0.03896103896103895, 0.0, 0.10389610389610393, 0.05194805194805199, 0.02597402597402597, 0.0, 0.012987012987012984, 0.012987012987012993, 0.012987012987012984, 0.0, 0.09090909090909094, 0.038961038961038995, 0.06493506493506492, 0.0, 0.07792207792207796, 0.0, 0.0, 0.0, 0.012987012987012984, 0.012987012987013, 0.012987012987012984, 0.0, 0.0, 0.0, 0.0, 0.0]




