Algorytmy stochastyczne
Wykład 09 – 11, Wnioskowanie w sieciach bayesowskich
Jarosław Piersa 2014-03-13
1 Przybliżone algorytmy wnioskowania
1.1 Próbkowanie logiczne
Dane: sieć bayesowska wraz z CPT, wiedza E, węzeł X z poza wiedzy X /∈ E Wynik: Prawdopodobieństwo P(X = xi|E), dla ustalonego (wszystkich) xi
Algorytm
• wylosuj rodziców zgodnie z prawdopodobieństwem z ich tabel,
• rekurencyjnie losuj potomków zgodnie prawdopodobieństwem odczytanym dla ustalonych rodziców,
• jeżeli wylosowana próbka nie spełnia wiedzy to ją odrzuć i rozpocznij kolejne losowanie,
• wylosuj w powyższy sposób M próbek spełniających wiedzę
• zwróć:
P(X = xi) := liczba próbek spełniających X = xi
M
UWAGA! jeżeli w wiedzy E jest ustalonych wiele zmiennych, to algorytm odrzuca znaczną większość próbek i potrzeba wiele losowań aby uzyskać zadaną liczbę zaakceptowanych próbek.
1.2 Ważone próbkowanie logiczne (ang. weighted logic sampling )
Dane: sieć bayesowska wraz z CPT, wiedza E, węzeł X z poza wiedzy X /∈ E Wynik: Prawdopodobieństwo P(X = xi|E), dla ustalonego (wszystkich) xi Algorytm
• losowanej próbce przypisz wagę wj := 1
• losując próbkę wymuszaj stany zgodnie z wiedzą, ale przy takim wymuszeniu zmień wagę (np. wymuszamy stan Y = y1):
wj:= wj· P(Y = y1|Rodzice(Y ))
• po wylosowaniu M próbek zwróć:
P(X = xi|E) = PM
j=11Xj=xi· wj PM
j=1wj .
Uwaga! Jeżeli wiedza jest sprzeczna to mianownik będzie zerowy. Przy wielu węzłach w wiedzy mogą się pojawić problemy numeryczne (sumowanie bardzo małych prawdopodobieństw i dzielenie przez bardzo mały mianownik)
1.3 Próbnik Gibbsa (Gibbs sampling)
Dane i wynik: jak wyżej Algorytm
• Wybierz losowy węzeł Z, który nie zawiera wiedzy,
• Oblicz rozkład prawdopodobieństwa Z dla tego węzła warunkując po wszystkich pozostałych węzłach w sieci (równo- ważnie: po jego rodzicach, potomkach i rodzeństwie)
P(Z|V \{Z}) ∝ P(Z = zj|Rodzice(Z)) · Y
U ∈Dzieci(Z)
P(U = u|Rodzice(U ), Z = zj)
• wylosuj nowy stan dla Z zgodnie z tym rozkładem powtarzaj wielokrotnie zapamiętując częstości przyjmowania X = xi
• zwróć:
P(X = xi|E) := częstość występowania stanów sieci w których X = xi Jak obliczyć rozkład P(Z|Blanket(Z))?
P(Z = zj|V \{Z}) ∝ P(Z = zj|Rodzice(Z)) ·Q
U ∈Dzieci(Z)P(U = u|Rodzice(U ))
=
P(Z = zj|Rodzice(Z)) · Q
U ∈Dzieci(Z)
P(U = u|Rodzice(U ), Z = zj) P
z0∈stany(Z)
P(Z = z0|Rodzice(Z)) · Q
U ∈Dzieci(Z)
P(U = u|Rodzice(U ), Z = z0) Przy czy
• P(Z = zj|Rodzice(Z)) — bezpośrednio z tabeli (rodzice są ustaleni)
• Rodzice(U ) — Z również jest rodzicem U , jest jedynym rodzicem U , który może się w bieżącej iteracji zmieniać
• P(U = u|Rodzice(U)) = P(U = u|Rodzice(U), Z = z0) — z tabeli (dla ustalonego Z = z0)
2 Wnioskowanie dokładne
2.1 Naiwny klasyfikator bayesowski Naive bayesian classifier
NBC — sieć bayesowska o ograniczonej strukturze, ale dzięki temu daje bardzo proste metody wnioskowania.
Powód
Symptom 1 Symptom 2 Symptom 3 · · · Symptom n
• przyczyna P , zmienna do zdiagnozowania — znajduje się w korzeniu drzewa,
• symptomy S1, ..., Sn, zmienne obserwowalne znajdują się w liściach,
• wiedzę wprowadzamy do liści (być może nie wszystkich): tzn jakie są objawy,
• wnioskujemy o przyczynie (co spowodowało takie zachowanie).
Dane: wiedza E: znane wartości (niektórych) węzłów w liściach.
Wynik: prawdopodobieństwo P(P = pi|E) dla wszystkich możliwych przyczyn pi. W ten sposób otrzymujemy najbardziej prawdopodobne wyjaśnienie.
• Chcemy
P(P = pi|E) = P(P = pi∧ E) P(E)
= P(E|P = pi) · P(P = pi) P(E)
= Q
V ∈E
P(V = vi|P = pi) · P(P = pi) P(E)
=
P(P = pi) Q
V ∈E
P(V = vi|P = pi) P(E)
(1)
• P(P = pi) oraz P(V = vi|P = pi) bezpośrednio z CPT
• P(E) jest tylko czynnikiem normalizującym (aby prawdopodobieństwa sumowały się do 1)
• i tak zamierzamy policzyć P(P = pi|E) dla każdego pi, zatem:
– obliczamy liczniki z równania (1) dla każdego P = pi
– S = suma liczników z równania (1) – Obliczamy
P(P = pi|E) := licznik z równania (1) S
2.2 Wnioskowanie w łańcuchach
Przypadek 1: sieć bayesowska ma strukturę łańcucha, tzn. każdy wierzchołek (poza korzeniem) ma dokładnie jednego rodzica; i każdy wierzchołek (poza jedynym liściem) ma dokładnie jednego syna.
U X Y
Dana jest wiedza E, tj. informacje że dla pewnych wierzchołków V = vi. Chcemy obliczyć P(X = xi|E), dla X w którym nie ma wiedzy (ogólnie: wszystkich takich X).
Podzielmy wiedzę na E = E+∪ E−, gdzie
• E+ — wierzchołki leżące ponad X (przyczyny X), na podstawie E+ przewidujemy zachowanie X (predykcja),
• E− — wierzchołki leżące poniżej X (skutki X), na podstawie E− diagnozujemy wystąpienie X (diagnostyka).
Mamy:
P(X = xi|E) = P(X = xi∩ E) P(E)
= P(X = xi∩ E+∩ E−) P(E+∩ E−)
= P(E−|X = xi∩ E+) · P(X = xi∩ E+)·
P(E+∩ E−)
= P(E−|X = xi∩ E+) · P(X = xi|E+) · P(E+) P(E+∩ E−)
Czynnik P(E+)
P(E+∩E−) nie zależy od X (stała normująca). Zamiast go liczyć można posumować resztę wyrażenia po wszystkich możliwych stanach X = xi.
Będziemy pisać:
P(X = xi|E) ∝ P(X = xi|E+)P(E−|X = xi∩ E+),
co oznacza, że prawdopodobieństwo zaobserwowania X = xi przy wiedzy E jest proporcjonalne do prawej strony.
Dalej:
• zastanówmy się nad: P(E−|X = xi∩ E+),
• jedyna ścieżka z E+ do E− musi przechodzić przez X (bo mamy łańcuch!),
• X jest ustalony na xi (chcemy policzyć P(X = xi|E)),
• zatem propagacja wiedzy z E+ do E− jest blokowana przez X
• dodatkowe warunkowanie po E+ jest zbędne,
• upraszczamy P(E−|X = xi∩ E+) = P(E−|X = xi) Upraszczamy we wzorze:
P(X = xi|E) ∝ P(X = xi|E+)P(E−|X = xi).
Oznaczmy
π(x) = P(X = xi|E+) λ(x) = P(E−|X = xi) gdzie
• πE(xi) — predictive support — jak bardzo prawdopodobne jest zaobserwowanie X = Xi przy wiedzy E,
• λE(xi) — diagnostic support — jak bardzo prawdopodobne jest, że wiedza E została spowodowana przez X = Xi. Jak obliczyć π?
• Jeżeli U jest rodzicem X, to
π(xi) := X
u∈states(U )
P(X = xi|U = u)π(u) states(U ) — sumujemy po wszystkich możliwych stanach węzła U (znaczy rodzica X).
• wiadomości π musimy policzyć: dla każdego węzła i dla każdego stanu w danym węźle
• warunki brzegowe: jeżeli w U jest wiedza, to π(ui) := 1 dla stanu ui zgodnego z wiedzą oraz π(ui) := 0 dla pozostałych stanów ui.
• warunki brzegowe: jeżeli U jest korzeniem, to π(ui) := P(U = ui) — prawdopodobieństwo apriori z tabeli
• nie musimy liczyć warunków brzegowych dla π(V ), gdy V jest liściem (zadanie: dlaczego?) Jak obliczyć λ?
• Jeżeli Y jest synem X to obliczamy
λ(xi) := X
y∈states(Y )
λ(y)P(Y = y|X = xi) (2)
• Warunki brzegowe: jeżeli V jest liściem z wiedzą, to przypisujemy: λ(vi) := 1 dla stanu vi zgodnego z wiedzą i λ(vj) := 0 dla pozostałych.
• Warunki brzegowe: jeżeli liściem bez wiedzy, to przypisujemy: λ(vi) := 1 dla wszystkich vi.
• Nie trzeba określać warunków brzegowych dla korzenia.
Obserwacja: Wnioskując potrzebujemy wiadomości π od węzłów wcześniejszych i λ od późniejszych. Zatem π jest wiado- mością propagowaną od korzenia do liścia, a λ od liścia do korzenia. Po wprowadzeniu wiedzy rozpoczynamy propagację obu wiadomości. Gdy obie przejdą całą sieć, to możemy policzyć prawdopodobieństwa aposteriori (warunkowe) dla wszystkich wierzchołków.
Algorytm (szkielet)
Dane: sieć bayesowska o kształcie łańcucha, prawdopodobieństwa warunkowe i wiedza E Wyniki: prawdopodobieństwa aposteriori P(X = xi|E) dla X z poza wiedzy.
• Węzłach z wiedzą przygotuj wiadomości π(xi) = 1 oraz λ(xi) = 1 dla stanów zgodnych z wiedzą i π(xi) = 0 oraz λ(xi) = 0 dla pozostałych
• Policz π(xi) od w kolejnych węzłach od korzenia do liści (pomijając zamrożone węzły!)
π(xi) =
( P(X = xi) dla korzenia, z CPT
P
u∈states(U )
P(X = xi|U = u)π(u) jeżeli U jest rodzicem X
• Policz λ(xi) od w kolejnych węzłach od liści do korzenia
λ(xi) =
( +1 dla liści
P
y∈states(Y )
λ(y)P(Y = y|X = xi) jeżeli Y jest synem X
• oblicz prawdopodobieństwa:
P(X = xi) := π(xi) · λ(xi) P
xj∈states(X)
π(xj) · λ(xj)
2.3 Wnioskowanie w drzewach
Przypadek 2. Sieć bayesowska jest drzewem tzn. dla dowolnych węzłów A, B istnieje dokładnie jedna ścieżka z A do B.
Dodatkowo: drzewo jest ukorzenione, co oznacza, że każdy węzeł (poza korzeniem) ma dokładnie jednego rodzica. Jak poprzednio: chcemy obliczyć P(X = xi|E) dla pewnego X oraz wiedzy E, X /∈ E.
U X
Y1
Y2
Podzielmy wiedzę na E = E+∪ E−, gdzie
• E+ — wierzchołki leżące ponad X (przyczyny X)
• E− — wierzchołki leżące poniżej X (skutki X)
Nadal pozostaje prawdą:
P(X = xi|E) = P(E−|X = xi∩ E+) · P(X = xi|E+) · P(E+) P(E+∩ E−)
∝ P(X = xi|E+)P(E−|X = xi∩ E+)
= P(X = xi|E+)P(E−|X = xi)
Tym razem E− może się znajdować w różnych poddrzewach potomków X. Potomkowie (Y1, Y2) X są niezależni warun- kowo na X = xi, co upraszcza
λ(xi) = P(E−|X = xi)
= P(E−Y1, E−Y2|X = xi)
= P(E−Y1|X = xi) · P(EY−1|X = xi)
= λY1(xi) · λY2(xi) Nie należy mylić λ i λY:
• λY(x) — wiadomość od potomka Y do rodzica X na stanie X = x
• λ(x) — wartość wsparcia diagnostycznego dla X (od wszystkich potomków)
λY(xi) = P(E−Y|X = xi)
= P
y∈states(Y )
P(E−Y|Y = y, X = xi)P(Y = y|X = xi)
= P
y∈states(Y )
P(E−Y|Y = y)P(Y = y|X = xi)
= P
y∈states(Y )
λ(y) · P(Y = y|X = xi)
Wzór przypomina (2), ale końcowe wsparcie λ(xi) jest mnożone po wszystkich potomkach, stąd rozbicie na λYi(...).
Dla rodzica U wierzchołka X:
π(xi) = P(X = xi|E+)
= P
u∈states(U )
P(xi|U = u, E+)P(U = u|E+)
= P
u∈states(U )
P(xi|U = u)P(U = u|E+)
= P
u∈states(U )
P(xi|U = u)πX(u)
(3)
Jeżeli X ma jednego syna Y1, to wiedza w poddrzewie jest już policzona i koniec. Jeżeli X ma dwóch lub więcej synów Y1, Y2, to wiedza z poddrzewa Y1 może wpływać na poddrzewo Y2 (wyjątek: wiedza jest w X i separuje Y1 i Y2) Jeżeli X otrzyma wiadomość λ od potomka Y1, to uaktualnia wiadomość π dla potomka Y2.
πY2(xi) = c · P(E−Y1|X = xiE+X)P(X = xi|E+X)
= c · P(E−Y1|X = xi)P(X = xi|EX+)
= c · λY1(xi)π(x)
= c · λY1(xi) ·P
u P(X = xi|U = u)πX(u)
(4)
Skalar c jest stałą normalizującą (czyt. policzyć po wszystkich xi i znormalizować).
Algorytm uaktualniania (Kim-Pearl) Krok 1:
1. Węzeł X otrzymuje polecenie uaktualnić swój stan
2. Węzeł X sprawdza wiadomość od rodzica πU(x) i od potomków λYi(x) 3. Oblicz
λ(x) :=Y
i
λYi(x)
π(x) := X
u∈states(U )
P(X = xi|U = u)πX(u)
P(X = xi|E) := λ(xi)π(xi) + normalizacja Krok 2: propagacja z dołu do góry
1. X czyta wiadomości λ od potomków
2. X oblicza i przekazuje wiadomości do rodzica Y λX(u) = X
x∈states(X)
λ(X)P(X = x|U = u)
3. Uwaga: to jest kolekcja wiadomości liczona dla możliwych stanów rodzica: u1, u2, u3...
Krok 3: propagacja z góry na dół
1. X oblicza wiadomości pi dla swoich synów Y1, Y2, ...Yk
2. dla syna Yj
πYj(x) := π(x)Y
l6=j
λYl(x) + normalizacja
Warunki brzegowe:
• dla wierzchołków z wiedzą: dla xi zgodnych z wiedzą
λ(xi) = 1 dla pozostałych xj
λ(xj) = 0
• dla liści bez wiedzy
λ(xi) = 1
• dla węzłów z wiedzą: dla stanów xi zgodnych z wiedzą
π(xi) = 1 dla pozostałych:
π(xi) = 0
• dla korzenia (jeżeli nie ma wiedzy)
π(xi) = P(xi)z CPT
2.4 Wnioskowanie w wielodrzewach
Przypadek 3.
Poprzez wielodrzewo (polytree) rozumiemy:
• graf skierowany acykliczny,
• dla każdej pary wierzchołków w grafie istnieje co najwyżej jedna ścieżka między nimi (może nie istnieć żadna), po zapomnieniu orientacji nie ma cykli w grafie,
• sieć może mieć kilka różnych „korzeni” (wierzchołki bez rodziców),
• wierzchołki mogą mieć wielu rodziców i wiele dzieci (z zastrzeżeniem punktu wyżej).
Wierzchołek X może mieć wielu synów Y1, Y2, ... oraz rodziców U1, U2, ....
U1
U2
U3
X
Y1
Y2 πX(u1)
πY1(x)
λX(u3)
λY2(x)
Nadal pozostaje prawdą:
• wiedza E dzieli się na wiedzę ponad X (przyczyny) i poniżej (skutki): E = E+∪ E−.
• X izoluje wiedzę predyktywną i diagnostyczną (każda ścieżka z E+ do E− przechodzi przez X)
• nadal mamy
P(X = xi|E) = P(E−|X = xi∩ E+) · P(X = xi|E+) · P(E+) P(E+∩ E−)
∝ P(X = xi|E+)P(E−|X = xi∩ E+)
= P(X = xi|E+)P(E−|X = xi)
= π(xi) · λ(xi) Przepływ z korzenia do liści
• jeżeli w X jest wiedza, to
π(xi) = 1 dla xi zgodnego z wiedza π(xi) = 0 dla pozostałych xi
• jeżeli X nie ma rodziców (UWAGA! w sieci może być kilka takich X, więc unikamy określenia „korzeń”) π(xi) = P(X = xi)
z CPT
• w pozostałych przypadkach (X ma rodziców U1, ..., Un):
π(x) := P(X = x|E+)
= P
states(u1,u2,...,un)
P(xi|U1= u1, ...Un = un, E+)P(U1= u1, ...Un= un|E+)
= P
states(u1,u2,...,un)
P(xi|u1, ...un) · P(U = u1|E+X) . . . P(Un = un|E+X)
= P
states(u1,u2,...,un)
P(xi|u1, ...un) ·Qn
i=1πX(ui)
• wiadomości z U do potomków πX(ui)
πX(ui) := P(U = ui|E+X)
= 1 jeżeli w U jest wiedza, lub...
= π(ui) · λ(ui) + normalizacja
= π(ui) · P(U = ui|E+X) // wiedza ponad X i poniżej U
= π(u) Q
W ∈children(U ),W 6=X
λW(u)
Przepływ z liści do korzenia:
• wsparcie diagnostyczne mnożymy po wszystkich potomkach:
– jeżeli w X jest wiedza, to
λ(xi) = 1 dla xi zgodnego z wiedza λ(xi) = 0 dla pozostałychxi
– jeżeli X jest liściem, to
λ(xi) = 1 – w pozostałych wypadkach (mnożymy po Y -ach, potomkach X)
λ(x) := P(E−|X = x)
= P(E−Y1, ..., E−Yk|X = x)
= P(E−Y1|X = xk) · . . . · P(E−Yk|X = x)
= Q
i
λYi(x)
• tym razem wiadomości od X do rodzica U λX(u) zależą również od pozostałych rodziców W1, W2...
λY(x) := P(EY−|X = x)
= P
y∈states(Y )
P(E−Y|X = x, Y = y) · P(Y = y|X = x)
= P
y∈states(Y )
P(E−Y|X = x, Y = y) · P
states(w1,w2,...)
P(Y = y, w1, w2..|X = x)
!
= P
y∈states(Y )
P(E−Y|X = x, Y = y) · P
states(w1,w2,...)
P(Y = y|X = x, w1, w2..)P(w1, w2, ...|X = x)
!
= P
y∈states(Y )
P(E−Y|Y = y) · P
states(w1,w2,...)
P(Y = y|X = x, w1, w2..)P(w1|E+Y) · . . . · P(wk|E+Y)
!
= P
y∈states(Y )
λ(y) P
states(w1,w2,...)
(P(y|x, w1, w2, ...)Q
iπY(wi))
!
przy czym: w1, w2... są pozostałymi rodzicami Y , P(y|x, w1, w2, ...) — bezpośrednio z tabeli warunkowej Y Uwaga: zależności są skomplikowane:
π(u)
λ(u)
πX(u)
λX(u)
π(x)
λ(x)
πY(x)
λY(x)
π(y)
λ(y)
pozostali rodzice X pozostali synowie X
• wiadomość πX(u) (U → X) powoduje
– wysłanie wiadomości πYi(x) do synów X (propagacja w dół drzewa)
– wysłanie wiadomości λXui do pozostałych rodziców X innych niż U (odbicie w górę) – optymalizacja: jeżeli wszystkie wiadomości λYi(x) są równe 1, to nie trzeba odbijać
– równoważnie: jeżeli żaden syn X ani jego pośredni potomek nie są w wiedzy, to nie trzeba odbijać
– powód: jeżeli nie ma wiedzy w poddrzewie ukorzenionym w X, to wszyscy rodzice Uisą niezależni pod warunkiem X, (wiedza w ustalonym U nie propaguje się do pozostałych)
• wiadomość λYi(x) wysłana Y → X
– propaguje się w górę drzewa do wszystkich rodziców X jako λX(ui) – odbija się do pozostałych braci Yj jako πYj(x)
• nie ma sensu propagować wiadomości jeżeli w docelowym węźle jest już wiedza
• propagowanie w pustej sieci bez wiedzy: wysyłamy π z korzeni sieci (nie ma nigdzie wiedzy zatem nie propagujemy λ)
• po zainstancjonowaniu wierzchołka X wysyłamy z X wiadomości λ do rodziców i wiadomości π do synów
Algorytm Kim-Pearl Sformułowanie za [1].
funkcja Inicjalizacja():
1. inicjalizacja odbywa się bez wiedzy, 2. przypisz wszędzie λ(∗) = 1, π(∗) = 1,
3. w węzłach bez rodziców: pi(xi) = P(X = xi) (wartość z CPT),
4. dla wszystkich węzłów bez rodziców: wyślij pi do każdego syna (bez odbijania λ, bo nie ma wiedzy).
funkcja Wyślij π(X, Y ) 1. przygotuj wiadomości:
πY(x) := π(x) Y
W ∈children(X),W 6=Y
λW(x)
dla wszystkich stanów x
2. jeżeli w Y nie ma wiedzy, to dodatkowo (a) oblicz
π(y) := X
states(x1,x2,...,xn)
P(yi|x1, ...xn) ·
n
Y
i=1
πY(xi)
(b) przypisz
P(Y = yi|E) := π(yi) · λ(yi) + normalizacja (c) dla wszystkich dzieci Z, wyślij π(Y, Z),
3. Jeżeli Y jest zainicjalizowany lub jakikolwiek pośredni potomek Y jest zainicjalizowany, 4. równoważnie: jeżeli λ(yi) 6= 1 dla jakiegokolwiek stanu yi
(a) dla wszystkich węzłów W — W jest rodzicem Y i W 6= X wykonaj funkcję wyślij λ(Y, W );
funkcja wyślij λ(Y, X) 1. Oblicz wiadomość λ:
λY(x) :=X
u
X
states(w1,w2,...)
P(y|x, w1, w2, ...)Y
i
πY(wi)
!
λ(y)
2. Oblicz:
λ(x) := Y
Yi∈children(X)
λYi(x)
3. przypisz
P(Y = yi|E) := π(yi) · λ(yi) + normalizacja 4. dla każdego U rodzica węzła X: jeżeli U nie zawiera wiedzy to wyślij λ(X, U ) 5. dla każdego W syna węzła X (brata węzła Y ): jeżeli W 6= Y to wyślij π(X, W ) funkcja uaktualnij(X, xi)
1. // ta funkcja uaktualnia prawdopodobieństwa, po ustaleniu wiedzy X = xi
2. przypisz
π(xi) := λ(xi) := P(X = xi|E) := 1 3. dla pozostałych stanów xj
π(xj) := λ(xj) := P(X = xj|E) := 0
4. dla wszystkich węzłów U — rodziców X, w których nie ma wiedzy wykonaj wyślij λ(X,U) 5. dla wszystkich węzłów Y — synów X: wyślij π(X,Y)
2.4.1 Uwagi
• wiadomość nie odbija się po tej samej krawędzi, z której przyszła,
• jeżeli w sieci nie ma cyklu (rozumianego jako cykl po zapomnieniu orientacji krawędzi) to propagacja zawsze dojdzie do
„liścia” (rozumianego jako: liczba synów + liczba rodziców = 1)i tam wygaśnie, zatem algorytm kiedyś się zakończy
• UWAGA! Jeżeli w sieci są dwie różne ścieżki między A i B (po zapomnieniu orientacji krawędzi istnieje cykl), to – propagacja π z A do B może odbić się od B jako λ,
– jako λ wrócić do A drugą ścieżką, – odbić się od A jako π,
– podążać do B znowu pierwszą ścieżką, Powstaje cykl, algorytm się zapętla.
Literatura
[1] R. Neapolitan, Learning bayesian networks, Pearspon Prentice Hall, Upper Saddle River, New Jersey 2004.
[2] P. Judea, Probabilistic reasoning and intelligent systems. Networks of plausible inference, Morgan Kaufman Inc. 1998.