Esegui la regola di combinazione di Dempster


9

Corso intensivo su ora legale

La teoria di Dempster-Shafer (DST) fornisce un metodo per combinare varie fonti di prove per formare una credenza. Dato un elenco di possibili affermazioni (una delle quali è la vera risposta), a ogni possibile combinazione di affermazioni viene assegnata una "massa" che indica il grado di evidenza a sostegno. La massa totale di tutte le combinazioni è sempre uguale a 1.

Da questi incarichi di massa, possiamo creare un limite inferiore (credenza) e limite superiore (plausibilità) ragionevoli sulla verità di quella combinazione. La convinzione bel(X)di qualsiasi set X è la somma delle masse di tutti i sottoinsiemi di X (incluso se stesso). La plausibilità pl(X)di qualsiasi insieme X è "1 - la somma delle masse di tutti gli insiemi disgiunti a X". Lo schema seguente mostra come credenza e plausibilità sono legate all'incertezza.

inserisci qui la descrizione dell'immagine

Ad esempio, supponiamo che ci sia un semaforo che potrebbe essere uno di Green, Ygiallo o Rrosso. L'elenco delle opzioni e un'eventuale assegnazione di massa sono mostrati di seguito:

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

Queste masse possono essere annotate da un array [0, 0.2, 0.1, 0.05, 0.2, 0.3, 0, 0.15].

Ora la domanda è: come possiamo decidere quali sono le masse? Diciamo che avevamo un sensore che guardava la luce, e questo sensore indica che la luce non è verde ; tuttavia, sappiamo che esiste una probabilità del 20% che il sensore abbia inviato un segnale casuale e spurio. Questo elemento di prova può essere descritto dalla distribuzione di massa in [0, 0, 0, 0.8, 0, 0, 0, 0.2]cui {Y, R} ha una massa di 0,8 e {G, Y, R} ha una massa di 0,2.

Allo stesso modo, supponiamo che un secondo sensore indichi che la luce non è rossa , ma sappiamo anche che esiste una probabilità del 30% che il sensore sia sbagliato e che la luce sia effettivamente rossa. Questo elemento di prova può essere descritto da [0, 0.3, 0, 0, 0, 0, 0.7, 0]dove {G, Y} ha una massa di 0,7 e {R} ha una massa di 0,3.

Per assimilare queste due prove per formare un'unica distribuzione di massa, possiamo usare la Regola di Combinazione di Dempster.

Regola della combinazione di Dempster

Due assegnazione massa m1e m2possono essere combinati per formare m1,2con le formule seguenti, dove A, Be Crappresentano possibili combinazioni (righe della tabella precedente).

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

dove K è una misura di "conflitto", utilizzata per la rinormalizzazione, ed è calcolata da:

inserisci qui la descrizione dell'immagine

È anche possibile descrivere geometricamente questo processo, come nell'immagine seguente. Se A = 011(Giallo o Rosso) e B = 101(Verde o Rosso), il valore di m1(A) * m2(B) contribuisce a (viene aggiunto a) il valore di m1,2(001)(Rosso). Questo processo si ripete per tutte le possibili combinazioni di A e B dove A&B != 0. Infine, l'array viene rinormalizzato in modo che i valori si sommino a un totale di 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- raffigurato-the-focale elements_big.pbm

Ecco un semplice metodo Java che combina due matrici seguendo la regola di 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;
}

Per vedere come funziona in pratica, considera i sensori del semaforo sopra, che danno in modo indipendente le masse [0, 0, 0, 0.8, 0, 0, 0, 0.2]e [0, 0.3, 0, 0, 0, 0, 0.7, 0]. Dopo aver eseguito la regola di Dempster, la massa articolare risultante è [0, 0.3, 0.56, 0, 0, 0, 0.14, 0]. La maggior parte della massa è assegnata a "Giallo", il che ha un senso intuitivo dato che i due sensori hanno restituito rispettivamente "non verde" e "non rosso". Le altre due masse (0,3 per "Rosso" e 0,14 per "Verde o Giallo") sono dovute all'incertezza delle misurazioni.

La sfida

Scrivi un programma che prende due elenchi di numeri reali e genera il risultato dell'applicazione della regola di Dempster ai due elenchi di input. Le lunghezze delle due liste di input saranno uguali e quella lunghezza sarà una potenza di 2 e sarà almeno di 4. Per ogni lista, il primo valore sarà sempre 0 e i valori rimanenti saranno tutti non negativi e aggiungeranno fino a 1.

L'output deve essere un elenco con la stessa lunghezza degli elenchi di input. Puoi presumere che esista una soluzione (è possibile che non esista una soluzione in caso di conflitto totale tra prove e quindi K = 1). Per stabilire un requisito minimo in termini di precisione, il programma deve essere in grado di produrre risultati accurati quando arrotondato al quarto decimale.

Esempio 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]

2
Alcune cose che volevo pubblicare nella sandbox, ma non ne ho avuto la possibilità: penso che la maggior parte delle domande dovrebbero essere scritte in modo che chiunque sia esperto in algebra possa capirle .. ecco alcune cose che penso dovrebbero essere chiarite: Cosa è m (x)? che cos'è un insieme disgiunto? come si arriva dal 20% a un insieme di masse? perché devi convertire le masse in un'altra serie di masse? cosa rappresenta il theta nella tua prima equazione? cosa rappresentano AB e C? Perché includere l'ora legale se la sfida si basa esclusivamente sulla DRC? non c'è bisogno di confondere le persone.

@trichoplax Ho aggiunto un requisito di precisione minimo (esatto quando arrotondato al quarto decimale).
PhiNotPi,

Risposte:


2

Perl, 68 byte

Include +2 per -an

Assegna il primo set come riga e il secondo come colonna su 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

Una soluzione da golf abbastanza standard. Non funziona se lo sostituisco @Hcon@;


Ben fatto. Informazioni sul "non funziona con @;": vedi stackoverflow.com/questions/39521060/…
Dada,

@Dada Quella risposta di overflow dello stack è stata molto utile. Ho vagamente saputo che queste variabili non si interpolano, ma non ho mai capito il motivo. E mi fa risparmiare un byte in Praming Puzles & Colf: Condense a String
Ton Hospel,

Prima della tua modifica, hai scritto "in qualche modo", quindi nel caso in cui non sapessi il perché, beh è una specie di scelta non documentata nell'implementazione ... Il "non funziona con @;" è a causa del "@H" giusto? (Se non poi il mio male, non importa il mio commento)
Dada

Sì, a causa di @HAfter ho pubblicato il post ho fatto un po 'più di esperimenti e ho visto che il problema era l'interpolazione delle stringhe, quindi ho rimosso il "in qualche modo" perché almeno il motivo diretto era chiaro. Ma fino a quando non mi hai fatto riferimento a quell'articolo, non sapevo ancora PERCHÉ quel tipo di interpolazione non funziona. Ora mi rendo conto che è una scelta consapevole da parte degli sviluppatori, quindi gli utenti saranno sorpresi meno spesso dall'interpolazione inaspettata dell'array poiché la maggior parte degli utenti non è molto consapevole delle variabili di punteggiatura.
Ton Hospel,

Oh scusa, ho letto male il tuo commento precedente: ho letto "non è stato molto utile" invece di "è stato molto utile". Bene, siamo d'accordo allora!
Dada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.