programmazione di un sistema esperto

7

Devo programmare un sistema esperto che, in base a una serie di possibilità complesse, restituisca un risultato ben definito, insieme a una sorta di diagnosi di cosa significhi questo risultato.

Qual è il processo generale per definire il comportamento di un sistema esperto, dalla valutazione iniziale delle condizioni al codice effettivo?

    
posta Stefano Borini 31.01.2011 - 14:05
fonte

4 risposte

5

Non ho esperienza di serio sviluppo di sistemi esperti, ma ho giocato con alcuni algoritmi correlati.

Il teorema di Bayes è interessante per quando le tue informazioni contengono le probabilità sbagliate - la probabilità di x data y quando hai bisogno della probabilità di y data x, in pratica.

ID3 è un modo facile da capire per decidere quale domanda porre per prima, in modo da poter trasformare una grande tabella di fatti in un albero decisionale. Rigorosamente, non penso che ID3 possa far fronte ad un esclusivo tipo di decisione, ma non è così difficile adattarsi.

Fondamentalmente, utilizza i calcoli "entropia" - la media ponderata della quantità di informazioni che si otterrebbe se si ricevesse una risposta particolare, data la probabilità di tale risposta (sia per il calcolo delle informazioni che per il peso). In una o-scelta, una risposta molto improbabile ti dà molte informazioni - se ottieni quella risposta. Una volta ponderate le risposte, le domande che danno la maggior parte delle informazioni in media tendono ad avere probabilità di risposta bilanciate. Un problema è che una domanda con molte risposte (ben bilanciate) ha più entropia di una con poche risposte possibili. Questo in realtà funziona bene per la mia attività di dispacciamento multiplo, ma potrebbe significare che un vero sistema esperto tenderebbe a porre domande scomode prima piuttosto che semplici.

Uso una variazione sul tema per un'utilità di generatore di codice per la gestione di più dispatch. Sì, è eccessivo, ma avevo già scritto che il codice non era interessante, quindi era logico utilizzarlo.

Il problema delle funzioni di invio multiple, però, è che ci sono solo poche "che tipo di tempo di esecuzione è quel parametro?" domande da considerare. Nella vita reale, ID3 dovrebbe essere un po 'lento, quindi ci sono un sacco di alternative. Un classico credo sia chiamato CN4.5. Non ho mai speso il tempo per capirlo, però.

ID3 e algoritmi simili per la costruzione di alberi decisionali sono spesso chiamati algoritmi di "induzione di regole". Penso di aver visto ID3 per la prima volta in un vecchio numero di PC World, in cui l'esempio stava identificando una moneta per le sue proprietà (rotonda o poligonale, argento o bronzo, ecc.).

Naturalmente algoritmi e frammenti di teoria della probabilità, di per sé, non si sommano a molto. Anche se conosci gli algoritmi di base, questo sembra essere solo il primo piccolo passo per capire come applicarli. Ad esempio, la mia modalità di invio multiplo è molto accurata: la tabella delle domande (parametri), le risposte (tipi di runtime) e le conclusioni (l'implementazione) sono completamente definite dalle regole dello strumento. Non devo preoccuparmi di cose come fare troppe domande, e quindi di ripetere a pappagalli specifici esempi di formazione piuttosto che principi di apprendimento. E sono molto contento di non avere questo problema soggettivo di cui preoccuparsi.

    
risposta data 31.01.2011 - 16:02
fonte
4

È passato molto tempo da quando ho svolto un lavoro di sistema esperto. Il processo di base è concettualmente semplice, ma il diavolo come si dice è nei dettagli. A quel tempo abbiamo utilizzato Java Expert System Shell ( JESS ). Essenzialmente ci sono due aspetti importanti dei sistemi esperti:

  • Fatti (le informazioni che stai ordinando)
  • Regole (come applicare il significato ai fatti)

Un terzo concetto facoltativo, ma utile è:

  • Ponderazione delle relazioni (quanto sono importanti i due fatti correlati)

Le regole possono alterare i fatti e la relazione / ponderazione tra i fatti. Il trucco sta nel trovare un insieme di regole che abbiano un senso, che non si contraddicano l'un l'altro e incarnino il significato di ciò che credono gli esperti. Questo è un compito non banale.

Vorrei avere le informazioni bibliografiche per il libro di riferimento che abbiamo usato, ma ho il sospetto che potrebbe essere fuori stampa ora. Tuttavia, per ulteriori letture potresti voler controllare le risorse su questa pagina: link

    
risposta data 31.01.2011 - 14:31
fonte
1

Una ricerca su google mostra quanto segue, che sembra contenere una bella panoramica:

link

Hai intenzione di scrivere da zero l'intero sistema esperto o utilizzerai uno strumento / libreria di builder per il lavoro?

    
risposta data 31.01.2011 - 14:12
fonte
1

La domanda è abbastanza generale, ma ecco alcuni suggerimenti. (Nota: diversi campi di competenza sono adatti per approcci diversi.)

  1. Il primo passo è avere un'idea di come funzionerà la tua rappresentazione della conoscenza. Parti da zero quindi ti consiglio di affrontare un problema piccolo ma simile e creare codice per gestirlo. (Nella mia esperienza non è difficile farlo. Puoi usare una varietà di lingue, ciò che fa per te. Non deve essere Lisp, F # o Haskell. L'ho fatto usando le lingue OO, Javascript può fai un buon lavoro ...)
  2. Normalmente controllerei l'area problematica, elaborerei ciò che speriamo di ottenere , stabilire un modo per misurare il successo, assicurarmi di avere abbastanza dati passati da confrontare. (Se non sai dove stai andando, è molto facile arrivarci!)
  3. Guarderei gli esperti disponibili , parliamo con loro, immaginiamo quello migliore per iniziare e poi lavoreremo sodo per ottenere quel ragazzo migliore. È generalmente difficile da fare, è molto richiesto. In caso contrario, non bruciare i ponti con gli altri esperti, probabilmente ne avrai bisogno in seguito se non all'inizio.
  4. Parla con l'esperto, stabilisci ciò che intendi implementare. Ci sarà spesso molto da scegliere. Calcola il pezzo migliore da affrontare per primo.
  5. Parla con il primo obiettivo (/ sezione) con l'esperto. Spesso non riesce a spiegarlo bene, lo fa, può essere un segno di vera competenza. Questo potrebbe richiedere del tempo, essere persistente, prendere appunti.
  6. Se disponi di un numero di insufficiente in codice in modo che possa essere eseguito con alcune UI disponibili . Web, programma desktop qualunque. Discutere abbastanza rapidamente con l'esperto. Continua lo slancio. Corri attraverso di lui. Discutilo mentre corre, perfeziona, correggi ...
  7. Corri attraverso 5. e 6 ripetutamente. Fino a quando non hai fatto abbastanza pezzi.
  8. Idealmente eseguilo con altri esperti . Questo in genere va molto più veloce e migliora il lavoro. Vedere un esempio significa che non è necessario spiegarlo dalle basi tanto per la seconda volta.
  9. Lucidalo, distribuiscilo ecc.

A volte vedo questo genere di cose senza un esperto. Se è il tuo caso, proverei a emulare un esperto in qualche modo.

La codifica tende ad essere facile , anche laddove la rappresentazione della conoscenza assume variabili continue (come input) e porta a conclusioni che sono più che booleane.

    
risposta data 01.02.2011 - 10:11
fonte

Leggi altre domande sui tag