Úvod do Bayesovských sítí víry

, Author

Bayesovská síť víry nebo Bayesovská síť či síť víry je pravděpodobnostní grafický model (PGM), který reprezentuje podmíněné závislosti mezi náhodnými veličinami prostřednictvím směrovaného acyklického grafu (DAG).

Příklad reprezentace Bayesovské sítě víry

Dnes se pokusím vysvětlit hlavní aspekty sítí víry, zejména pro aplikace, které mohou souviset s analýzou sociálních sítí(SNA). Kromě toho vám ukážu příklad implementace tohoto druhu sítě.

K čemu používáme bayesovské sítě?

Bayesovské sítě se uplatňují v mnoha oblastech. Například diagnostika nemocí, optimalizované vyhledávání na webu, filtrování spamu, genové regulační sítě atd. A tento výčet lze ještě rozšířit. Hlavním cílem těchto sítí je snaha o pochopení struktury kauzálních vztahů. Abychom to objasnili, uvažujme problém diagnostiky onemocnění. S danými příznaky a jejich výslednou nemocí zkonstruujeme naši síť víry, a když přijde nový pacient, můžeme odvodit, jakou nemoc nebo nemoci může mít nový pacient, a to tak, že pro každou nemoc stanovíme pravděpodobnost. Podobně lze tyto kauzální vztahy konstruovat i pro jiné problémy a inferenční techniky použít k zajímavým výsledkům.

Rychlý přehled pravděpodobnosti

Než budeme pokračovat, pro osvěžení paměti uvedu definici podmíněné vlastnosti. Podmíněná pravděpodobnost je pravděpodobnost náhodné veličiny, je-li dána nějaká jiná náhodná veličina. Vyplývá to ze vztahu

Jsou-li tyto dvě náhodné veličiny závislé,

Jsou-li nezávislé, pak

Matematická definice sítí víry

Pravděpodobnosti se vypočítají. v sítích víry podle následujícího vzorce

Jak byste pochopili ze vzorce, abychom mohli vypočítat společné rozdělení, potřebujeme mít k dispozici podmíněné pravděpodobnosti uvedené v síti. Ale dále, že pokud máme společné rozdělení, můžeme si začít klást zajímavé otázky. Například v prvním příkladu se ptáme na pravděpodobnost „DEŠT“, pokud „SEASON“ je „ZIMA“ a „Psí štěkot“ je „PRAVDA“.

Příklad Belief Network v Pythonu

Takže, myslím, že teorie už bylo dost a pojďme se podívat na nějaký reálný příklad s mým současným oblíbeným programovacím jazykem Python ❤️ Než budeme pokračovat, najdete zde zápisník Jupyter, který jsem napsal.

# create the nodes
season = BbnNode(Variable(0, 'season', ), )
atmos_pres = BbnNode(Variable(1, 'atmos_press', ), )
allergies = BbnNode(Variable(2, 'allergies', ), )
rain = BbnNode(Variable(3, 'rain', ), )
grass = BbnNode(Variable(4, 'grass', ), )
umbrellas = BbnNode(Variable(5, 'umbrellas', ), )
dog_bark = BbnNode(Variable(6, 'dog_bark', ), )
cat_mood = BbnNode(Variable(7, 'cat_mood', ), )
cat_hide = BbnNode(Variable(8, 'cat_hide', ), )bbn = Bbn() \
.add_node(season) \
.add_node(atmos_pres) \
.add_node(allergies) \
.add_node(rain) \
.add_node(grass) \
.add_node(umbrellas) \
.add_node(dog_bark) \
.add_node(cat_mood) \
.add_node(cat_hide) \
.add_edge(Edge(season, allergies, EdgeType.DIRECTED)) \
.add_edge(Edge(season, umbrellas, EdgeType.DIRECTED)) \
.add_edge(Edge(season, rain, EdgeType.DIRECTED)) \
.add_edge(Edge(atmos_pres, rain, EdgeType.DIRECTED)) \
.add_edge(Edge(rain, grass, EdgeType.DIRECTED)) \
.add_edge(Edge(rain, umbrellas, EdgeType.DIRECTED)) \
.add_edge(Edge(rain, dog_bark, EdgeType.DIRECTED)) \
.add_edge(Edge(rain, cat_mood, EdgeType.DIRECTED)) \
.add_edge(Edge(dog_bark, cat_hide, EdgeType.DIRECTED)) \
.add_edge(Edge(cat_mood, cat_hide, EdgeType.DIRECTED))

Naše uzly jsme nejprve popsali pomocí podmíněných pravděpodobností. Měli byste si všimnout, že jsem pro jednoduchost vynechal některé možné hodnoty stavu. Například proměnná roční období nabývá jiných hodnot „jaro“ a „podzim“. Myšlenka je tedy stejná.

No, zkontrolujme, zda je naše síť zkonstruována správně, nebo ne.

with warnings.catch_warnings():
warnings.simplefilter('ignore')
graph = convert_for_drawing(bbn)
pos = nx.nx_agraph.graphviz_layout(graph, prog='neato')plt.figure(figsize=(20, 10))
plt.subplot(121)
labels = dict()
nx.draw(graph, pos=pos, with_labels=True, labels=labels)
plt.title('BBN DAG')

Výsledkem tohoto úryvku kódu by byl následující graf

Takže vidíte, že tato síť odpovídá mému fantazijnímu nákresu na začátku. Nyní provedeme nějakou inferenci na této síti víry.

# convert the BBN to a join tree
join_tree = InferenceController.apply(bbn)# insert an observation evidence
ev = EvidenceBuilder() \
.with_node(join_tree.get_bbn_node_by_name('season')) \
.with_evidence('winter', 1.0) \
.build()join_tree.set_observation(ev)# print the marginal probabilities
for node in join_tree.get_bbn_nodes():
potential = join_tree.get_bbn_potential(node)
print(node)
print(potential)
print('--------------------->')

Tento úryvek kódu v podstatě dává síti důkaz, podle kterého je roční období zima s pravděpodobností 1,0. To znamená, že se jedná o zimní období. Když podle tohoto důkazu provedeme inferenci, dostaneme následující výsledky.

0|season|winter,summer
0=winter|1.00000
0=summer|0.00000
--------------------->
2|allergies|allergic,non_alergic
2=allergic|0.70000
2=non_alergic|0.30000
--------------------->
3|rain|rainy,sunny
3=rainy|0.80000
3=sunny|0.20000
--------------------->
4|grass|grass,no_grass
4=grass|0.70000
4=no_grass|0.30000
--------------------->
1|atmos_press|high,low
1=high|0.50000
1=low|0.50000
--------------------->
5|umbrellas|on,off
5=on|0.95200
5=off|0.04800
--------------------->
6|dog_bark|bark,not_bark
6=bark|0.66000
6=not_bark|0.34000
--------------------->
7|cat_mood|good,bad
7=good|0.23000
7=bad|0.77000
--------------------->
8|cat_hide|hide,show
8=hide|0.87150
8=show|0.12850
--------------------->

Když přidáme další důkazy, například že pes neštěká

# convert the BBN to a join tree
join_tree = InferenceController.apply(bbn)# insert an observation evidence
ev = EvidenceBuilder() \
.with_node(join_tree.get_bbn_node_by_name('season')) \
.with_evidence('winter', 1.0) \
.build()ev2 = EvidenceBuilder() \
.with_node(join_tree.get_bbn_node_by_name('dog_bark')) \
.with_evidence('not_bark', 1.0) \
.build()join_tree.set_observation(ev)
join_tree.set_observation(ev2)# print the marginal probabilities
for node in join_tree.get_bbn_nodes():
potential = join_tree.get_bbn_potential(node)
print(node)
print(potential)
print('--------------------->')

Dostaneme následující výsledky inference

0|season|winter,summer
0=winter|1.00000
0=summer|0.00000
--------------------->
2|allergies|allergic,non_alergic
2=allergic|0.70000
2=non_alergic|0.30000
--------------------->
3|rain|rainy,sunny
3=rainy|0.47059
3=sunny|0.52941
--------------------->
4|grass|grass,no_grass
4=grass|0.53529
4=no_grass|0.46471
--------------------->
1|atmos_press|high,low
1=high|0.39706
1=low|0.60294
--------------------->
5|umbrellas|on,off
5=on|0.88941
5=off|0.11059
--------------------->
6|dog_bark|bark,not_bark
6=bark|0.00000
6=not_bark|1.00000
--------------------->
7|cat_mood|good,bad
7=good|0.52647
7=bad|0.47353
--------------------->
8|cat_hide|hide,show
8=hide|0.83162
8=show|0.16838
--------------------->

Vidíte ten rozdíl? 😆 Spousta hodnot pravděpodobnosti se změnila, když jsme přidali důkaz týkající se štěkání. Je to určitě hloupý příklad, ale je hezké získat intuici.

Jak používat Bayesovské sítě v SNA?

Bayesovské sítě jsou velmi mocným nástrojem k pochopení struktury kauzálních vztahů mezi proměnnými. Jakmile navrhnete svůj model, může vám i s malým souborem dat říci různé věci. Otázka v této části zní, jak lze získat výhody Bayesovských sítí v SNA. Odpověď není jednoznačná, ale začněme hlubokou myšlenkou. V SNA se snažíme pochopit strukturu sociální sítě. Kromě toho se snažíme pochopit důležitost uzlů. Nevíme však, že jaké jsou výsledky našeho měření důležitosti. V tomto bodě nastupují Bayesovské sítě. Pokud si například myslíte, že důležitost uzlu je způsobena Centralitou stupně a Centralitou spojení, můžete mít následující síť:

To je velmi naivní Bayesovská síť. Kromě určení důležitosti uzlů může být další aplikací hledání nějakého specifického typu uzlů. Uvažujme Sociální síť, ve které jsou nějací lidé, kteří jsou potenciálními vůdci, a já je chci vyhledat. Uvažujme následující graf

Tato trochu složitější síť nám pomůže určit nejistotu uzlů souvisejících s tím, že jsou vůdci.

Další aplikací bude odvozování vazeb. Nové vazby lze odvodit ze stávajících vazeb. Například z členství ve skupině v sociální síti lze odvodit pravděpodobnou členskou vazbu. Měl jsem na mysli, že můžeme modelovat novou vazbu mezi uživateli a skupinami s ohledem na existující vazby. Viz následující modelové schéma

Toto jsou tedy základní příklady toho, jak lze Bayesovské sítě použít v SNA. Toto téma není příliš prostudované, ale myslím, že by mohlo být velmi užitečné se jím dále zabývat.

Závěr

Nejtěžší na Bayesovských sítích je navrhování. Zvláště, když si vzpomenete na SNA, zkonstruovat mapování ze Sociální sítě pomocí Bayesovské sítě je spíše umění než věda 😃 Ale jakmile jste odvedli uměleckou práci a navrhli svůj model velmi dobře, mohou vám tyto šikovné nástroje říci mnoho věcí. Jak víme, Bayesovské sítě se uplatňují v rozsáhlých druzích oblastí. Ve většině případů fungovaly velmi dobře. Proto pevně věřím, že i na sociálních sítích můžeme učinit velmi hluboké závěry.

Pro další zkoumání pomocí SNA a Bayesovských sítí, prosím, zůstaňte naladěni 🚀

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.