Виконайте правило комбінування Демпстера


9

Курс крашів по DST

Теорія Демпстера-Шафера (DST) пропонує метод поєднання різних джерел доказів для формування віри. Враховуючи перелік можливих тверджень (одне з яких є правдивою відповіддю), кожній можливій комбінації тверджень присвоюється "маса" із зазначенням ступеня підтверджуючих доказів. Загальна маса всіх комбінацій завжди дорівнює 1.

З цих масових призначень ми можемо створити розумну нижню межу (віра) та верхню межу (правдоподібність) на правдивості цього поєднання. Віра bel(X)будь-якої множини X - це сума маси всіх підмножин X (включаючи і себе). Правдоподібність pl(X)будь-якого множини X дорівнює "1 - сума маси всіх множин, непересічних на X". На діаграмі нижче показано, як віра та правдоподібність пов'язані з невизначеністю.

введіть тут опис зображення

Наприклад, припустимо , що є світлофор , який може бути один або GReen, Yellow або 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.

https://www.researchgate.net/profile/Fabio_Cuzzolin/publication/8337705/figure/fig1/AS:349313566822412@1460294252311/Fig-1-Dempster's-rule-of-combination-On-the-yx-axes-are- зображений-the-focal-elements_big.pbm

Ось простий метод 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]

2
Деякі речі, які я хотів опублікувати в пісочниці, але не отримав шансу: я думаю, що більшість питань повинні бути написані так, щоб хтось, хто знав алгебру, міг їх зрозуміти. є m (x)? що таке роз'єднаний набір? як ви отримуєте від 20% до набору мас? навіщо вам перетворювати маси в інший набір мас? що тета представляє у вашому першому рівнянні? що представляють AB та C? Навіщо включати DST, якщо виклик базується виключно на ДРК? не потрібно плутати людей.

@trichoplax Я додав мінімальну вимогу точності (точний, коли округлюється до 4 знаків після коми).
PhiNotPi

Відповіді:


2

Perl, 68 байт

Включає +2 для -an

Надайте перший набір як рядок, а другий як стовпець на STDIN

perl -M5.010 dempster.pl
0.0  0.0  0.5  0.5
0.0
0.7
0.1
0.2
^D
^D

dempster.pl:

#!/usr/bin/perl -an
/$/,map$H[$m%@F&$m++/@F]+=$_*$`,@F for<>;say$%++&&$_/(1-"@H")for@H

Досить стандартне рішення для гольфу. Чи не працює , якщо я заміню @Hна@;


Хороший. Про "не працює @;": дивіться stackoverflow.com/questions/39521060/…
Dada

@Dada Ця відповідь про переповнення стека була дуже корисною. Я смутно знав, що ці змінні не інтерполюють, але ніколи не розуміли причину. І це заощаджує мені байт у молитвах "Puzzle & Colf: Condense a String
Ton Hospel

Перед редагуванням ви написали "якось", тож у випадку, якщо ви не знали чому, ну це наче незадокументований вибір у реалізації ... "Не працює з @;" це через "@H" правильно? (Якщо не тоді мій поганий, то не забувайте про мій коментар)
Dada

Так, через те, що після того, @Hяк я зайняв пост, я трохи більше експериментував і побачив, що проблема полягає в інтерполяції рядків, тому я усунув "якось", тому що принаймні пряма причина була зрозуміла. Але поки ти не відправив мене до тієї статті, я все ще не знав, ЧОМУ така інтерполяція не працює. Тепер я усвідомлюю, що розробники усвідомлюють свій вибір, тому користувачі рідше дивуватимуться несподіваній інтерполяції масиву, оскільки більшість користувачів не дуже обізнані з пунктуаційними змінними.
Тонне Євангеліє

Пробачте, я неправильно прочитав ваш попередній коментар: я прочитав "не дуже корисно" замість "було дуже корисно". Ну ми згодні тоді!
Дада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.