Intuitio
Tämä ei ole matematiikan kurssi eikä tätä materiaalia ole kirjoittanut matematiikan opettaja. Siitä huolimatta kurssilla täytyy hieman käsitellä todennäköisyysmatematiikkaa, tilastotiedettä ja lineaarialgebraa. Tässä osiossa käsitellään Bayesin teoreemaa intuition tasolla. Tämä pohjustaa seuraavia vaiheita, joissa käytämme Bayesin teoreemaa koneoppimisessa. Valittu, hyvin yksinkertainen Bayesilainen esimerkki on: "todennäköisyys, että opiskelija on läpäissyt pizzakurssin". Tämä merkittäisiin näin:
Huomaa, että B on kaavassa tapahtuma. P(B) on tapahtuman todennäköisyys. Tässä lapsellisessa esimerkissä oletetaan, että aiemman datan nojalla -kurssin on läpäissyt 75 % opiskelijoista, joita voit tavata käytävällä. Todennäköisyys on siis empiirinen arvio, joka on saatu aiemmista havainnoista. Empiirisen vastakohta olisi teoreettinen todennäköisyys. 1 Esimerkiksi ideaalimaailman nopalle ja kolikolle tunnetaan todennäköisyys.
Riippuvaisuus
Riippumattomat tapahtumat
Mikäli käytävällä tulee kaksi satunnaista opiskelijaa vastaan, voimme pohtia, että: "Kuinka todennäköistä on, että kummatkin ovat läpäisseet kurssin?". Olettaen että tapahtumat ovat riippumattomia, voimme laskea tämän seuraavasti:
Tämän voi helposti todistaa käymällä läpi kaikki kombinaatiot. Mahdollisten parien joukko voidaan ajatella karteesisena tulona (engl. cartesian product) kahdesta joukosta.
from itertools import product
B1 = [1, 1, 1, 0] # 3/4 = 0.75
B2 = [1, 1, 1, 0]
n = len(list(product(B1, B2)))
count = 0
for b1, b2 in product(B1, B2):
print(f"{b1=}, {b2=} -> {b1 and b2}", end="")
if b1 and b2:
count += 1
print(f" <== {count}/{n}")
else:
print()
Klikkaa tuloste esiin
Koodissa tulostetaa yksi rivi per oppilas (B1,B2) kombinaatio. Tuloste on:
b1=1, b2=1 -> 1 <== 1/16
b1=1, b2=1 -> 1 <== 2/16
b1=1, b2=1 -> 1 <== 3/16
b1=1, b2=0 -> 0
b1=1, b2=1 -> 1 <== 4/16
b1=1, b2=1 -> 1 <== 5/16
b1=1, b2=1 -> 1 <== 6/16
b1=1, b2=0 -> 0
b1=1, b2=1 -> 1 <== 7/16
b1=1, b2=1 -> 1 <== 8/16
b1=1, b2=1 -> 1 <== 9/16
b1=1, b2=0 -> 0
b1=0, b2=1 -> 0
b1=0, b2=1 -> 0
b1=0, b2=1 -> 0
b1=0, b2=0 -> 0
Kaikista vaihtoehdoista 9/16 on sellaisia, joissa molemmat opiskelijat ovat läpäisseet kurssin. Tämä on sama kuin laskettu todennäköisyys eli 0.5625.
Vähintään toinen?
Voi olla hyödyllistä muistella myös läheisesti liittyvää ongelmaa. Mitä tulostuu, mikäli vaihdat yllä olevasta koodista and-operaatiot or-operaatioiksi. Kysymys tällöin on, että: kuinka todennäköistä on, että vähintään toinen opiskelija on läpäissyt kurssin?.
Todennäköisyys ei suinkaan ole 3/4 + 3/4 eli 6/4. Prosentteina tämä olisi 150 %, minkä pitäisi olla jo intuition perusteella selkeästi väärä vastaus. Yksi tapa laskea todennäköisyys on summata both + only_left + only_right, jossa both on yltä tuttu 3/4 * 3/4, ja kaksi muuta ovat kumpainenkin 3/4 * 1/4. Toinen tapa on käyttää seuraavaa kaavaa:
Yllä olevat for-loopin lisäksi voit laskea saman murtoluvuilla joko käsin tai Pythonilla. Tästä esimerkki alla:
Riippuvaiset tapahtumat
Aiemmin esitellyt tapahtumat ovat keskenään riippumattomia. Kullakin satunnaisesti vastaan tulevalla opiskelijalla on sama 75 % mahdollisuus kuulua heihin, jotka ovat läpäisseet kurssin. Kun arvioit vastaantulevan opiskelijan kurssin läpäisyn mahdollisuutta, sinun arviointiisi voivat vaikuttaa kuitenkin useat seikat, kuten että toisella opiskelijalla on kainalossaan The Pizza Bible -kirja. Pizzantekemiseen liittyvien kirjojen lukeminen oletettavasti vaikuttaa kurssin läpäisemisen todennäköisyyteen.
Lausemuodossa tämä on: "Kurssin läpäisemisen todennäköisyys, annettuna että olet lukenut The Pizza Biblen, on 96 %." Kaavassa B on yhä sama -kurssin läpäisy.
A on tapahtuman ehto. P(B|A) on tapahtuman todennäköisyys, annettuna ehto. Huomaa, että tällöin tapahtumat eivät ole keskenään riippumattomia vaan nimenomaan riippuvaisia toisistaan.
Tip
Kuinka paljon kirjan lukeminen siis nostaa kurssin läpäisyn todennäköisyyttä? Tämä voidaan laskea seuraavasti:
Tämä tarkoittaa, että The Pizza Bible kirjan lukeminen nostaa todennäköisyyttä suhteellisesti 28 %, eli absoluuttisesti 21 prosenttiyksikköä (0.96 - 0.75 = 0.21).
Ethän sekoita riippumattomia ja riippuvaisia tapahtumia?
Oletetaan, että kirjan lukemisen todennäköisyys on 50 %. Puolet oppilaista ovat lukeneet kirjan.
Huomaa, että et voi laskea näiden lukujen avulla vastausta kysymykseen: "Kuinka todennäköistä on, että satunnainen opiskelija on läpäissyt kurssin JA lukenut kirjan" yksinkertaisella kertolaskulla eli:
Käytetyn kaavan pitäisi ottaa huomioon, että tapahtumat vaikuttavat toisiinsa. Yllä oleva kaava toimii riippumattomien tapahtumien kanssa, mutta toisistaan riippuvien tapahtumien kanssa käytetään seuraavaa kaavaa:
Entäpä kysymys "Kuinka todennäköistä on, että satunnainen opiskelija on läpäissyt kurssin TAI lukenut kirjan"? Tämä voidaan laskea seuraavasti, olettaen että ujutat P(A,B)-tilalle yllä näkyvän kaavan, jonka tulos on 0.48:
Todennäköisyyden selvittäminen
Täysin tasapainoinen kolikko tai noppa on tyypillinen todennäköisyysmatematiikassa käytetty esimerkki. Arkielämän ilmiöissä jonkin tapahtuman todennäköisyys pitää selvittää havaintojen perusteella. Esimerkiksi, jos haluat selvittää, kuinka todennäköistä on, että opiskelija läpäisee kurssin, voit käyttää aiempia kurssisuorituksia. Yllä todennäköisyydeksi on väitetty 75 %:n todennäköisyyttä. Kuinka tähän lukuun ollaan päädytty? Kuvitellaan, että tämä on selvitetty kyselytutkimuksella. Kyselyssä on kysytty 32 opiskelijalta, ovatko he läpäisseet kurssin.
- 24 opiskelijaa vastasi kyllä
- 8 opiskelijaa vastasi ei
Todennäköisyys voidaan laskea seuraavasti:
Warning
Huomaathan, että 32 oppilaan otannalla ei voida varmuudella sanoa, että todennäköisyys oikeasti on 75 %. Näin pienellä otannalla virhemarginaali on suuri (jotakuinkin ± 15 %, 95% luottamustasolla). Näin pienellä otannalla on vain noin 50 % mahdollisuus, että todellinen todennäköisyys on välillä 70 % - 80 %.
Pieni otos tuottaa epävarmemman arvion kuin suuri otos. Mitä suurempi otanta, sitä todennäköisempää on, että todennäköisyyslukema vastaa ilmiön todellista todennäköisyyttä. Alla on esitetty kolmen eri otannan todennäköisyysjakaumat. Huomaa, että mitä suurempi otanta, sitä kapeampi jakauma on.

Kuvio 1. Kolmen eri otannan todennäköisyysjakaumat. 32 opiskelijan otannalla jakauma on leveämpi kuin 100 ja 200 opiskelijan otannoilla.
Tilanne on sama kuin jos heität kolikko tai kuusitahoista noppaa. Yksittäisellä heitolla et voi sanoa, että kolikon tai nopan todennäköisyys on 50 % tai 1/6. Mutta kun heität kolikkoa tai noppaa tarpeeksi monta kertaa, todennäköisyyslukema lähestyy todellista todennäköisyyttä. Todellinen todennäköisyys ei välttämättä ole tosielämän kolikolla tai nopalla tasan 50 % tai tasan 1/6.
Yllä näkyvän Kuvio 1:n voit generoida seuraavalla koodilla:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
sample_size = [32, 100, 200]
plt.figure(figsize=(10, 6))
for n in sample_size:
# Compute passes and fails
passes = int(0.75 * n)
fails = n - passes
# Plot the Beta distribution
x = np.linspace(0, 1, 1000)
y = beta.pdf(x, passes, fails)
plt.plot(x, y, label=f'{n} students ({passes}/{fails} passes/fails)')
plt.grid(True)
plt.show()
Pieni otos jättää jakauman leveäksi ja epävarmaksi, kun taas suuri otos tekee arviosta tarkemman. Seuraavassa interaktiivisessa työkalussa tätä havainnollistetaan kolikonheittojen avulla säätämällä prioria ja havaittujen onnistumisten määrää: Bayesian Inference.
Case: SLO
Service Level Objective (SLO) kuvaa palvelun tavoiteltua luotettavuutta. Kokonaisluotettavuus riippuu siitä, ovatko palvelut sarjassa vai rinnakkain.2
Sarjakytkentä
Jos palvelu C riippuu sekä A:sta että B:stä, kaikkien kolmen pitää toimia, jotta kokonaisuus toimii.
flowchart TD
A[System A]
B[System B]
C[System C]
A --> C
B --> C
Jos \(P(A)\), \(P(B)\) ja \(P(C)\) ovat kaikki 95 % luotettavia, niin kokonaisluotettavuus on:
Rinnakkaiset reitit
Jos käyttäjä voi mennä minkä tahansa CDN-solmun kautta järjestelmään, riittää että yksi CDN toimii, olettaen, että System X itsessään ei ole alhaalla. Oletetaan, että System X on 99 % luotettava, ja CDN:t ovat kukin 95 % luotettavia.
flowchart TD
U[User]
CDN1[CDN 1]
CDN2[CDN 2]
CDN3[CDN 3]
BE[System X]
U --> CDN1
U --> CDN2
U --> CDN3
CDN1 --> BE
CDN2 --> BE
CDN3 --> BE
Tällöin kokonaisuuden luotettavuus voidaan laskea seuraavasti:
Jos aihepiiri eli järjestelmän saavutettavuus kiinnostaa, kannattaa tutustua alkuperäiseen Composite SLO-artikkeliin.
Case: Agentic AI
flowchart TB
subgraph VG["With validation gates"]
direction TB
G1{Gate}
R1[Retry or repair]
B1[Agent 1]
C2[Agent 2]
G2{Gate}
R2[Retry or repair]
C3[Agent 3]
SP((Stable propagation))
B1 --> G1
G1 -->|valid| C2
G1 -->|invalid| R1
R1 --> B1
C2 --> G2
G2 -->|valid| C3
G2 -->|invalid| R2
R2 --> C2
C3 --> SP
end
subgraph NV["No validation"]
direction TB
A1[Agent 1]
A2[Agent 2]
A3[Agent 3]
A4[Agent 4]
CF((Cascade failure))
A1 --> A2 --> A3 --> A4 --> CF
end
Nicole Koenigstein esitteli O'Reilly AI Codecon: Software Craftsmanship in the Age of AI-konferenssissa AI-agenttien välisten virheiden korjaamista validaation avulla. Yllä oleva kuvaaja on adaptaatio hänen vastaavasta kuvaajasta. Esityksen otsikko oli: "The Hidden Cost of Agentic Failure and the Next Phase of Agentic AI". Suora lainaus hänen esityksestään: "If your base success is 0.30 and you want 98% effective success you need 11 attempts." 3 Idea on siis, että esimerkiksi ChatBot-agentin ensimmäinen vaihe yrittää tuottaa JSON:n seuraavalle agentille. Jos JSON ei läpäise määriteltyjä testejä, tätä yritetään \(n\) kertaa. Järjestelmän luotettavuus kasvaa.
Käänteinen todennäköisyys
Palataan takaisin pizzaesimerkkiin. Tähän asti me tiedämme todennäköisyydet:
P(A) = 0.5- The Pizza Bible kirjan lukemisen todennäköisyys
P(B) = 0.75-kurssin läpäisemisen todennäköisyys
P(B|A) = 0.96-kurssin läpäisemisen todennäköisyys, annettuna että olet lukenut The Pizza Bible kirjan.
Mutta mitä jos haluamme selvittää, että: "Kuinka todennäköistä on, että opiskelija on lukenut kirjan, annettuna että hän on läpäissyt kurssin?". Tämä voidaan laskea alla näkyvällä kaavalla, joka — kuinka ollakaan — on Bayesin teoreema:
Tämä ajatus, että todennäköisyys voidaan laskea asioille, joita ei ole välttämättä vielä kertaakaan tapahtunut, on Bayesin ytimessä. Tämän tulkinnan hyväksyminen tai hylkääminen jakaa matemaatikot leireihin bayesilaiset ja freventistit. Jos ihmettelet termiä Bayes, se viittaa 1700-luvulla eläneeseen presbyteeripappiin ja matemaatikkoon Thomas Bayes. 4
Tehtävät
Tehtävä: Bayes ja työssäkäyntitilastot
Aja notebook 210_bayes_polars.py. Tutustu koodiin ja tässä materiaalissa esitettyyn teoriaan. Tässä vaiheessa tavoitteena ei ole ymmärtää kaikkia yksityiskohtia, vaan saada intuition tasolla kiinni siitä, mitä koodi tekee. Kiinnitä erityisesti huomiota seuraaviin asioihin:
- mitä tarkoittaa suora arvio (direct estimate / easy problem)
- miksi suora arvio muuttuu epäluotettavaksi, kun ehtoja lisätään paljon
- miten Naive Bayes ratkaisee tämän ongelman hajottamalla laskun useisiin yksinkertaisempiin todennäköisyyksiin
Varmista ymmärryksesi muokkaamalla esimerkkiä niin, että lisäät Bayes-laskuun myös seuraavat ehdot:
- henkilö on opiskelija
- henkilön kieli on suomi
Voit halutessasi kokeilla lisätä nämä ehdot myös suoraan arvioon (easy problem), mutta huomaat todennäköisesti nopeasti, mikä ongelma syntyy, kun ehtoja on paljon. Siispä tee muutokset erityisesti notebookin harder problem -osioon.
Lähteet
-
Downey, A. Think Bayes, 2nd Edition. O'Reilly Media. 2021. ↩
-
Ewerlöf, A. Composite SLO. https://blog.alexewerlof.com/p/composite-slo ↩
-
Koenigstein, N. The Hidden Cost of Agentic Failure and the Next Phase of Agentic AI. O'Reilly AI Codecon. 2026-03-26. ↩
-
Kämäräinen, J. Koneoppimisen perusteet. Otatieto. 2023. ↩