Konvolúcióról érthetően


Ez a cikk azoknak készült akik szeretnének szemléletes képet kapni arról, hogy mi az a konvolúció, vagy például honnan jön a konvolúció képlete.

A konvolúció lényegében az átlag fogalmának az általánosítása. Itt csak az egydimenziós konvolúcióról fogok írni, de ha ezt megértettük, akkor már magasabb dimenzióra is könnyebb elképzelni.

Ahhoz, hogy megértsük a konvolúció fogalmát, először a diszkrét változattal érdemes kezdeni. Ehhez lássuk először a tőzsdét! Furcsa lehet, hogy a tőzsdével kezdjük,és elsőre távolinak tűnhet a példa, de a diszkrét konvolúció szemléltetéséhez ez az egyik legegyszerűbb út.

Vegyünk mondjuk egy OTP részvényt. Ennek ma a záróára 5270 Ft volt. Most az egyszerűség kedvéért legyen ez 3 Ft. A részvény ára minden nap végén általában más és más. Pl. tegnapelőtt még 4Ft volt, azelőtt megint 3Ft stb.. Az alábbi ábra kilenc napra visszamenőleg mutatja egy képzeletbeli részvény árának változását.

konvolucio

Néhány helyen ráírtam az értéküket is. Ma azaz jan 11-én, 3Ft- on zárt.
A kérdés a következő: Hogyan becsüljük meg a következő napi értéket (Jan 12) ?

Ha pusztán a fenti adatsorból próbálnánk meg a részvény következő napi értékét megbecsülni, akkor először természetesen adódik, hogy vonjunk átlagot a megelőző értékekből, de ez máris felvet egy újabb kérdést: hány értékből vonjunk átlagot? Az elmúlt egy évből, vagy csak az elmúlt kilenc napból? Nos, ez nagyrészt függ a tőzsde működésétől is. Általában egy évvel , vagy néhány hónappal ezelőtti értéke nem sokat számít bele a holnapi árba (pl. hogy egy hónappal ezelőtt volt-e nagyobb kiugrás egy-két napig ,az nem igazán számít), viszont a tegnapi vagy tegnap-előtti értékek annál inkább!

A példa kedvéért vegyünk egy négynapos átlagot. Ez azt jelenti, hogy a mai napi értéket úgy becsülöm, hogy átlagot vonok az elmúlt 4 napból, a holnapit úgy , hogy átlagot vonok az azt megelőző 4 napból stb..:

$$ F(n) \approx \frac{F(n-1) + F(n-2) + F(n-3) + F(n-4)}{4} $$

Itt F(n) az n. napi árat jelenti. A nagybetű arra utal, hogy F diszkrét függvény.
Amit itt láttok, annak a neve mozgó-átlag. Ahogy az látható, azért "mozgó", mert visszamenőleg az adatsorból csak egy részhalmazt átlagolok: 4 napot, egy hónapot stb.. A fenti példa esetén a január 12-ei értéket igy számolom: F(jan12) ≈ (3+4+3+10)/4 = 5.
Pl. a február 5-ei értéket pedig így: (feb4 + feb3 + feb2 + feb1)/4 .

Észrevehető, hogy ugyanez könnyen felírható vektorok skaláris szorzataként is: $$ F(\mbox{jan}12) \approx [0.25\quad 0.25 \quad 0.25 \quad 0.25 ] \cdot [3 \quad 4 \quad 3 \quad 10] $$ (Itt 0.25-tel, azaz 1/4 -del szorozgatom végig, majd összeadom őket.)
Ha egy kicsit elgondolkodunk, akkor ez majdnem olyan, mintha két különböző "függvény" elemeit látnánk magunk előtt, egyiknek az értékei a 0.25-ből álló vektor, a másiké pedig a [3, 4, 3, 10] vektor és ezeket szorozgatnánk össze!

Próbáljuk meg egy kicsit általánosítani ezt az egészet! A fenti képen látható legelső kék diagram tehát F(n) képe. Egy másik függvény, G(n), pedig legyen a következő:
konvolucio 2
F(n) és G(n) legyen értelmezve \$-\infty$\ -től \$+\infty$\ -ig, és ahol a képeken nincsenek ábrázolva ott mindenhol legyen 0 az értékük.

Azt kell észrevenni, hogy így van egy súlyfüggvényünk, G(n) , és van F(n) az "adatfüggvényünk". Namármost, ezekkel a függvényekkel is leírhatjuk a fenti "átlagolást" (mozgó-átlag), amint azt a fenti skalárszorzásnál láttuk. Legyen A(n) az n. napi becslés, - vagy átlag - az előző napokból, ekkor: $$ A(n) = \sum_{k=1}^4\;G(k) \cdot F(n-k) $$ Ami itt van az csak annyi, hogy egy n. napra úgy számolom ki az átlagot, hogy összeszorozgatom a G(n) és F(n) megfelelő értékeit, majd ezt a négy szorzatot összeadom.. A szumma 4-ig megy, mert G(n) ilyen "hosszú". Érdemes megfigyelni, h ogy F paraméterként (n-k) -t kapott, azt jelenti , hogy ahogy k növekszik, úgy "visszafelé haladunk" F -ben. Hogy miért kell így csinálni az hamarosan kikristályosodik.
A következő animáció mutatja, hogyan működik a fenti képlet.
(Figyelem, az animáción 0.25 helyett véletlenül 2.5-öt írtam. Erre figyeljetek, mert megtévesztő lehet. Majd javítom a jövőben, elnézést érte.)

Animáció elrejtése/megjelenítése

A képen egyszerre látható az F és G függvény. A G függvény hasonlóan az előző képhez barna szinű. Az animáció alsó részén látható az A(n) változása is, csak ez túl gyors lehet, ezért ide is kiírtam két lépést (valamint feltettem youtube-ra ott meg lehet állítani):

A(6)=0.25*10+ 0.25*6 + 0.25*5 + 0.25*8
A(7)=0.25*3 + 0.25*10 + 0.25*6 + 0.25*5
A piros nyilak mutatják mely értékeket szorzunk össze, lényegében ezek a nyilak felelnek meg a feni szummában a k változásainak. Itt látható ahogy "visszafelé haladunk" F ben. Ha megfordítanánk/tükröznénk a G függvényt, akkor láthatóan a piros nyilak nem haladnának egymással szembe, és talán könnyebb lenne elképzelni ezt ez egészet, ezért magyarázzák úgy gyakran, hogy: "első lépésben tükrözzük a G-t".. Látható, hogy az A(n) függvény -vagyis az n. nap "becslése"-, ahogy növeljük az n-et változik,és vele együtt mozog a G függvény. Az n=1-nek a képen most Jan4 felel meg, n=5-nek pedig Jan 8. Az animáció A(6)-tal kezdődik, azaz először Jan 9-ei értéket "becsüljük" meg. Az is megfigyelhető, olyan mintha a G függvény "csúszna" az F függvényen. (Igazság szerint a fenti képlet szerint úgy kéne az animációt csinálni, hogy az F függvény csússzon -a negatív irányba- ,de úgy talán zavarosabb lett volna, illetve akkor a k nem 0 -től 4-ig menne. A konvolúció kommutatív, magyarul mindegy melyik függvény "mozog", végül ugyanazt kapjuk, de csak akkor ha a k \$-\infty$\-től \$+\infty$\ -ig megy .)

Amit így kapunk A(n)-re általában nem jó becslés. A G(n) függvény konstans -mindenhol 0.25- , ami azt jelenti, hogy a 4.nap (visszafelé számolva) is ugyanolyan súllyal számít be az átlagba mint a tegnapi nap. A tőzsdénél, -és sok más különböző helyen- a hozzánk közelebbi napok nagyobb súllyal szerepelnek. Ezért válasszuk úgy G(n)-et, hogy ne konstans, hanem egy exponenciális függvény legyen!

Az animáción is megfigyelhető volt, hogy először a G(n) "elejét" és az F(n) "végét" szorozzuk össze, majd ezután ellentétes irányba haladunk. Magyarul, hogy jobb becslést kapjunk, úgy kell G(n)-et megválasztanunk, hogy a függvény eleje nagyobb legyen, majd a vége felé csökkenjen.
Ezt teljesíti pl a következő függvény:
$$ G(n) = e^{-0.4n} $$

Diszkretizálva kb. így néz ki:
konvolucio 3

A fenti animációban G(n) helyére ezt az "exponenciális" függvényt tesszük, ettől eltekintve minden ugyanúgy megy, ahogy fent. (A nyíl mutatja a G(n) haladási irányát):
konvolucio

Talán sikerült megérteni ebből a diszkrét példából, hogy hogyan lehet eljutni egy ilyen "kibővített" átlagfogalom-ig. Nincs más hátra, mint áttérni folytonos függvényekre. Ekkor a szummából integrál lesz és a fenti egyenletből ez lesz:

$$ A(t) = (g * f)(t) = \int_1^4 g(\tau) \cdot f(t-\tau)d\tau $$ Itt a kisbetűk már a folytonos függvényekre utalnak. A konvolúciót gyakran (f*g)-vel vagy (g*f)-fel is jelölik.

A következő kérdés még hátravan: általában a tau az integrálban -ellentétben a fenti képlettel- \$-\infty$\ -től \$+\infty$\ -ig megy , miért van ez ?

Egyrészt azért ,mert előre nem tudjuk, hogy az f és g milyen "hosszú". Másrészt lehet olyan eset mikor pl. a g függvény így néz ki:
konvolucio

Ekkor úgy tekinthetünk g-re mintha több különálló függvényből lenne "összerakva", fel kell bontani az integrált, (először 1- től t-ig megy az integrálás majd 2-től 3-ig stb..), így a konvolúcós integrált (itt) háromszor kéne leírni: (valamilyen f függvényt odaképzelve)

$$ (g*f)(t) = \begin{cases} \int_1^t 5(\tau-1)\cdot f(t-\tau) d\tau & 1 \leq t \leq 2 \\\\ \;... &\\ \;... \end{cases} $$

Nem írtam le minden tagot. Majd néhány valós példán megpróbálom bemutatni, hogyan kell a konvolúciót kiszámolni, (az integrálási határokat felvenni stb..). A lényeg, hogy azért kell \$-\infty$\ -től \$+\infty$\ -ig integrálni, mert könnyebben le lehet írni/kevesebb helyet foglal. (A harmadik ok, hogy miért kell: ha nem végtelenig integrálnánk nem mindig teljesülne a kommutativitás, ezt egyszerű elképzelni, ha már megértettük a konvolúciót.)

Végeredményben tehát a konvolúció definíciója: $$ (f*g)(t) \int_{-\infty}^{+\infty} f(\tau)g(t-\tau)d\tau $$ vagy $$ (g*f)(t) \int_{-\infty}^{+\infty} g(\tau)f(t-\tau)d\tau $$
És a kommutativitás miatt ezek egyenlőek: (f*g)(t) = (g*f)(t).

A következő animáció a folytonos esetben mutatja a konvolúciót:

Animáció elrejtése/megjelenítése

Az animáción a következő látható: A hátsó (nagy)lila függvény f, és a kisebb súlyfüggvény g, amelyik mozog. Illetve a fekete görbe, ami a (f*g)(t) értékét mutatja, és minden t pillanatban "frissül" ahogy g halad a t tengelyen. A függvények alatti területet a láthatóság kedvéért kiszíneztem. Az alábbi függvények vannak az animáción:

$$ f(t) = \begin{cases} e^{-0.4t} & ,ha \;-3 \leq t \leq 0\\ 0 & ,egy\acute{e}bk\acute{e}nt \end{cases} $$ $$ g(t) = \begin{cases} -2(t-1) & ,\;ha \;0 \leq t \leq 1\\ 0 & ,egy\acute{e}bk\acute{e}nt \end{cases} $$ $$ (f*g)(t) = \int_{-\infty}^{+\infty} e^{-0.4t} \cdot -2(t-\tau-1) d\tau $$ (Az f függvény most ugyanaz mint az előbb a diszkrét G(n) függvény , csak most folytonos és más az értelmezési tartomány). A g(t) függvény képe:
konvolucio

(Az animáción ez a függvény tükrözve jelenik meg.)
Azt, hogy hogyan kell konkrétan a konvolúciót kiszámolni különböző függvények esetén, ha lesz időm, majd néhány példán keresztül bemutatom. Példák ITT.
A konvolúciónak sok alkalmazása van, pl. gyakran használják arra, hogy "kisimítsanak" egy adott függvényt, tehát a kisebb eltéréseket eltüntessék belőle, kiszedjék a zaj egy bizonyos részét.. Most az animáción is talán kivehető, hogy a (g*f) függvény hasonlít az f függvényre, és hogy az f fenti "csúcsa" a (f*g)-n lekerekedik/kisimul. Persze ez a "simaság" tetszőlegesen változhat, attól függően milyen g súlyfüggvényt választunk.

Kapcsolódó cikkek:
Konvolúció példák

Források:
Akit mélyebben érdekel (angol): Bracewell, R. "Convolution" 25.oldaltól
Wolfram Mathworld - Convolution
Az ötletet az animációra az angol wikipédia adta
Saját jegyzetek

14 Komment

  1. Ágnes

    Nagyon jó cikk, érthető magyarázattal és igényes ábrákkal. Sokat segített, köszönöm szépen!

  2. Kérdező

    Jó oldal, csak gratulálni tudok hozzá. Az oktatási rendszerrel ellentétben a dolgok lényegét mutatja be úgy, ahogy és amiért azokat megalkották és nem a mindezt eltakaró elegáns, de semmitmondó matematikai megközelítést.
    Két dolog szúrt szemet:
    $$
    (g*f)(t) =
    \begin{cases}
    \int_1^t 5(\tau-1)\cdot f(t-\tau) d\tau & 1 \leq t \leq 2 \\\\
    \;... &\\
    \;...
    \end{cases}
    $$
    itt a leírás szerint 4-szer kell integrálni, ez nem világos, hiszen ha úgy nézzük, 3 függvénnyel lehet definiálni azt a "trapéz" alakú függvényt.
    ---
    itt viszont mintha az exp. fv. argumentuma lekerült volna szorzótényezőnek:
    $$ (f*g)(t) = \int_{-\infty}^{+\infty} e{-0.4t} \cdot -2(t-\tau-1) d\tau $$

  3. Gábor

    Nagyon jó leírás, csak gratulálni tudok hozzá.
    Viszont nálam nem kristályosodott ki, miért halad visszafele a súlyfüggvény. Erről ha lehetne még kicsi kiegészítés az nem volna rossz.

Szólj hozzá!

Az email cím nem lesz publikálva!

LaTeX kódot is írhatsz a $$ ... $$ vagy \$ ... $\ közé helyezve.
Komment előnézet:

Név

Captcha:

Nincsenek rendesen kitöltve a mezők! Komment hozzáadva