Курс крашів по DST
Теорія Демпстера-Шафера (DST) пропонує метод поєднання різних джерел доказів для формування віри. Враховуючи перелік можливих тверджень (одне з яких є правдивою відповіддю), кожній можливій комбінації тверджень присвоюється "маса" із зазначенням ступеня підтверджуючих доказів. Загальна маса всіх комбінацій завжди дорівнює 1.
З цих масових призначень ми можемо створити розумну нижню межу (віра) та верхню межу (правдоподібність) на правдивості цього поєднання. Віра bel(X)
будь-якої множини X - це сума маси всіх підмножин X (включаючи і себе). Правдоподібність pl(X)
будь-якого множини X дорівнює "1 - сума маси всіх множин, непересічних на X". На діаграмі нижче показано, як віра та правдоподібність пов'язані з невизначеністю.
Наприклад, припустимо , що є світлофор , який може бути один або G
Reen, Y
ellow або R
ред. Перелік варіантів та можливе призначення маси наведено нижче:
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.
Щоб засвоїти ці два докази, щоб сформувати єдиний масовий розподіл, ми можемо використовувати Правило поєднання Демпстера.
Правило поєднання Демпстера
Два масового призначення 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]
. Після виконання правила Демпстера отримана спільна маса є [0, 0.3, 0.56, 0, 0, 0, 0.14, 0]
. Більшість маси призначається "Жовтий", що має інтуїтивний сенс, враховуючи, що два датчика повернулися "не зеленим" і "не червоним" відповідно. Дві інші маси (0,3 для "Червоного" і 0,14 для "Зеленого або Жовтого") обумовлені невизначеністю вимірювань.
Змагання
Напишіть програму, яка бере два списки реальних чисел і виводить результат застосування правила Демпстера до двох списків введення. Довжина двох вхідних списків буде дорівнює, і ця довжина буде потужністю 2, і буде принаймні 4. Для кожного списку перше значення завжди буде 0, а решта значень будуть невід'ємними і додадуть до 1.
Вихідним повинен бути список тієї ж довжини, що і списки введення. Можна припустити, що рішення існує (можливо, рішення не існує, коли існує повний конфлікт між доказами і, отже, K = 1). Щоб встановити мінімальну вимогу до точності, ваша програма повинна мати можливість виробляти точні результати, округлені до чотирьох знаків після коми.
Приклад вводу / виводу
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]