Выполнить правило комбинации Демпстера


9

Ускоренный курс по DST

Теория Демпстера-Шафера (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.

Чтобы ассимилировать эти два доказательства для формирования единого массового распределения, мы можем использовать Правило комбинации Демпстера.

Правило комбинации Демпстера

Два массового назначения 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- изображены-заместитель фокальной elements_big.pbm

Вот простой Java-метод, который объединяет два массива в соответствии с правилом Демпстера:

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
Некоторые вещи, которые я хотел опубликовать в песочнице, но у меня не было шанса: я думаю, что большинство вопросов должно быть написано так, чтобы любой, кто разбирается в алгебре, мог их понять ... вот несколько вещей, которые, я думаю, должны быть разъяснены: Что такое м (х)? что такое непересекающееся множество? как ты получаешь от 20% до набора масс? почему вам нужно преобразовать массы в другой набор масс? что представляет тета в вашем первом уравнении? что представляют собой AB и C? Зачем включать DST, если задача основана исключительно на DRC? Не надо путать людей.

@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 Ответ на переполнение стека был очень полезен. Я смутно знал, что эти переменные не интерполируются, но никогда не понимал причину. И это экономит мне байт в « Praming Puzles & Colf: Сгущение струны»
Тон Хоспел

Перед редактированием вы написали «как-то», так что на случай, если вы не знаете, почему, ну, это как бы недокументированный выбор в реализации ... «Не работает с @;» из-за "@H" правильно? (Если нет, то мой плохой, не берите в голову мой комментарий)
Дада

Да, из-за @Hтого, что я сделал пост, я немного поэкспериментировал и увидел, что проблема в интерполяции строк, поэтому я удалил «как-то», потому что, по крайней мере, прямая причина была ясна. Но пока вы не отослали меня к этой статье, я все еще не знал, ПОЧЕМУ такая интерполяция не работает. Теперь я понимаю, что это сознательный выбор разработчиков, поэтому пользователи будут реже удивляться неожиданной интерполяции массива, поскольку большинство пользователей не очень осведомлены о переменных пунктуации.
Тон Хоспел

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