Akut myocardialis infarctus (AMI) lokalizációjának automatikus meghatározása Mesterséges intelligencia módszereinek alkalmazása az orvostudományok területén
Írta: Ferenci Tamás Email:
[email protected]
Előszó Ez a dolgozat bemutatja egy, az orvosi és a mérnöki tudományok határterületén fekvő probléma megoldását. Példa arra, hogyan lehet egy klinikai orvostudomány keretein belül felvetődő kérdést a modern számítástechnika, ezen belül is kiemelten a mesterséges intelligencia eszközeivel megoldani. A jó minőségű megoldás egyaránt igényli a feladat orvosi hátterének megértését, és a rendelkezésre álló számítástechnikai lehetőségek (valamint azok korlátainak) ismeretét. A feladat megoldásához a mesterséges intelligencia területén belül egy lágy számítási (soft computing) módszert, a mesterséges neurális hálózatokat használtam fel. A dolgozat első felében áttekintem a kérdéshez kapcsolódó orvosi ismereteket. A meglehetősen átfogó tárgyalás az élettani alapok ismertetésénél indul, majd továbbhaladva eléri a klinikai vonatkozásokat is. Természetesen nagyon sok részlet nem szerepel itt, de mégis igyekeztem olyan leírást adni, mely kifejezett orvosi előképzettség nélkül is követhető, önmagában is megállja a helyét. Ezt követően mutatom be a kitűzött feladat megoldását neurális hálók használatával. Már most szeretném hangsúlyozni, hogy dolgozatom elsődleges célja az volt, hogy bemutassam: egy ilyen feladatot hogyan lehet egy számítógépes módszer (esetünkben a neurális hálók) nyelvére lefordítani. Másodlagosnak tartottam annak bemutatását, hogy a megkapott, felhasználásra kész adatokat hogyan kell ténylegesen a megfelelő programnak „beadagolni”, várva a végeredményt, azaz a tanított, működésre kész hálót. Manapság az ilyen feladatok megoldására nagyon jól automatizált programok léteznek, melyek egyéni beállítások nélkül, vagy minimális testreszabás mellett is igen jó eredményeket szolgáltatnak. Nem tagadom természetesen, hogy a tényleges hálókonstrukció apró részleteinek kézbentartása sokat javíthat a hatékonyságon – mégis, ezekkel jelen dolgozat keretei között nem foglalkoztam. Ugyanilyen okból kezeltem nagyvonalúan olyan kérdéseket, mint az optimális háló kiválasztása, és foglalkoztam csak röviden a neuronszám meghatározásával stb. Ezek egy másik munka anyagát képezhetnék. E felfogás jegyében viszont teljes részleteséggel fogom tárgyalni az adatok előkészítésének meglehetősen hosszas műveletét, miközben bemutatom az erre a célra írt több száz sornyi Matlab kódomat is. A dolgozat céljából adódóan mindenhol különös hangsúllyal térek ki azokra a kérdésekre, melyek a későbbi neurális hálós implementáció miatt vetődtek fel: a bemenő dimenzió korlátok között tartására, a tanítóvektorok tartalmának meghatározására stb. Dolgozatom befejezéseként bemutatom az így előkészített adatok alapján tanított neurális hálót, röviden összefoglalom a tanítás eredményességét. Ez utóbbi alapján értékelem munkámat, végül pedig összefoglalom a továbbfejlesztési lehetőségeket is. Az igényes orvosi áttekintés és az előfeldolgozás részletes ismertetése – különösen egy ilyen speciális téma esetében – reményeim szerint a dolgozatot esettanulmány szintjére emelik.
1. Orvosi alapok A most következő részben áttekintem a feladat szempontjából releváns élettani és egyéb kapcsolódó ismereteket. Ezzel természetesen nem lehet más célom, mint annyi betekintés nyújtása az orvostudományok ezen részébe, amennyi a későbbiek érdemi megértéséhez szükséges. Mindazonáltal nem próbáltam erőszakoltan „minimumra törekedni” az orvosi háttér ismertetésénél: ahol a gondolatok lezárt egységei, a logika követése szükségessé tette, ott igyekeztem a jelenségeket összefüggéseikben is tárgyalni - még akkor is, ha emiatt nem közvetlenül témába vágó részekkel bővült is a dolgozatom. A célom az volt, hogy minimális előzetes ismerettel is felszínes, de átfogó képet alkothasson az olvasó szerveztünk működésének témával kapcsolatos vonatkozásairól.
1.1. Elektrofiziológiai alapismeretek Az emberi test, mint élő szervezet alapegysége a sejt. Testünket mintegy 1014 darab, azaz 100 billió sejt építi fel, melyek bámulatos rendezettségben és szervezettségben dolgoznak egyetlen közvetlen cél, az organizmus fenntartása érdekében.
1
Egy felnőtt ember testének 60%-a folyadék – főleg ionok és egyéb anyagok vizes oldata. Ennek a folyadéknak nagyjából 1/3-a található sejtjeinken belül, míg a maradék 2/3 rész a sejteken kívüli folyadék. E folyadékterekben különféle ionok vannak oldva, melyek eloszlása igen jellegzetes: példának okáért, a Na+ -ionok koncentrációja inkább a sejteken kívül magas, addig a K+ -ionoké1 a sejteken belül. A sejthártyáról és a transzmembrán folyamatokról De hogyan lehetséges, hogy a sejt belseje és külvilága között ilyen drámai különbség van az ionok koncentrációjában? Nyilvánvaló, hogy ennek kulcsa a sejteket határoló sejthártyában keresendő. A sejthártya (első közelítésben) egy lipid kettősréteg2 , benne és körülötte különböző funkciójú fehérjemolekulákkal. A sejthártya legszembeötlőbb jellegzetessége a szelektív barrier funkciója, vagyis azon tulajdonsága, hogy a rajta zajló anyagáramlást a végletekig speciális módon képes szabályozni. A hártya közepének hidrofób karakteréből adódóan víz és vízoldékony anyagok nem tudnak átjutni közvetlenül a sejthártyán, ám néhány kisebb zsíroldékony anyag igen. (Például az O2 szinte ellenállás nélkül hatol át a sejthártyán.) A sejthártyán keresztüli, azaz transzmembrán anyagáramlásnak természetesen nem az egyetlen módja a közvetlen diffúzió. Bizonyos sejthártyabeli fehérjék, kiemelten az ún. csatornaképző és karrier fehérjék további utakat nyitnak a sejthártyán keresztüli anyagáramlásnak. Az előbbiek által képezett fehérjecsatornák lehetővé teszik olyan anyagok számára is a diffúzióval történő átjutást, melyek egyébként vízoldékonyságuk miatt elakadnának (így jut át a sejthártyán maga a víz). E csatornák jellegzetessége egyrészt szelektív permeabilitásuk (ez alapján beszélünk például Na+ - és K+ -csatornákról, melyek csak a megfelelő ionok számára átjárhatóak) és a kapuzási (gating) képességük (vagyis, hogy permeabilitásuk bizonyos jellemző, például a potenciálkülönbség függvényében változik, azaz a csatornák „be tudnak csukni” és „ki tudnak nyitni”). A karrier fehérjék egyrészt segíthetik a diffúziót: a diffundáló molekula ráköt a fehérjére, ami konformációs változást szenved, így a kötött anyag átjut a túloldalra, ahol leszakad a fehérjéről. Ilyen ún. facilitált diffúzióról csak akkor beszélünk, ha az anyag áramlása abba az irányba zajlik, amerre spontán módon is végbemenne (legfeljebb karrier fehérje hiányában egyéb ok meggátolná). Ettől eltér az aktív transzport, mely szintén karrier fehérjén megy végbe, csak épp metabolikus energiafelhasználás mellett – cserébe olyan irányba is tud transzportálódni anyag, mely a diffúzió által választott úttal épp ellentétes lenne. A fentiek célja annak érzékeltetése volt, hogy a sejthártyák milyen nagy számú anyagáramlási folyamatban vesznek részt – mégpedig mindegyikben fontos, de sokszor egészen eltérő jellegű szabályozási feladatot betöltve. Képességük, hogy különböző anyagokat eltérő módon eresszenek át, (néha időfüggő áteresztési jellemzőket is biztosítva!) alapvető fontosságú a szervezeten belüli elektromos jelenségek létrejöttében. A töltésmegoszlás eredete Hogy megértsük milyen elektrokémiai jelenségek zajlanak le a sejthártya két oldala között, tekintsünk egy egyszerű szemléltető példát! Képzeljünk el egy elektromosan szigetelő hártyát, melynek egyik oldalán magas a K+ koncentrációja, másik oldalon alacsony, miközben a hártya csak a K+ számára átjárható. (Természetesen a K+ mellett egyéb, negatív töltésű ionok is találhatóak a hártya két oldalán lévő oldatban, ez biztosítja azok kezdeti nulla össz-töltését.) A koncentrációkülönbség K+ ionokat fog áthajtani a hártya egyik oldaláról a másikra, azonban ne feledjük: a hártya áteresztőképessége miatt más ion ezt nem tudja követni! A következmény: a hártya két oldala között potenciálkülönbség fog fellépni, hiszen töltött ionok áramlanak egyik oldalról a másikra (amit nem ellensúlyoz sem ellentétes töltésű ionok azonos irányba, sem azonos töltésű ionok ellenétes irányba történő áramlása). Az ionok átáramlása addig tart, míg 1A 2A
két folyadéktérben mért koncentráció különbsége mindkét ion esetében legalább egy nagyságrendnyi! kettősréteg két sorban elhelyezkedő lipidmolekulákat jelent, melyek apoláros farokrészeikkel fordultak egymás
felé.
2
a folyamatosan felépülő, és az átáramlás gátlása irányába ható feszültség épp ellent nem tart az átáramlást serkentő koncentrációkülönbség hatásával. Végletekig leegyszerűsítve ez az a mechanizmus, ami miatt az emberi testben – hiába vagyunk teljes egészében elektromosan semlegesek – mégis töltések megoszlásával találkozunk. (Ami azt illeti: lépten-nyomon, mint azt majd látni is fogjuk.) Nyugalmi potenciál és akciós potenciál A példabeli esetben (ideális körülmények között végezve a számításokat) azt találjuk, hogy -94 mV potenciálkülönbség alakulna ki a hártya két oldala között. Nyilvánvaló, hogy ez a példa a sejthártya helyzetét próbálta meg szemlélteteni, de az is világos kell legyen az eddig mondottakból, hogy testünk valódi sejthártyái ennél sokkal bonyolultabb körülmények között működnek. Ha – ennek megfelelően – figyelembe vesszük a többi ion hatását és a hártya egyes ionokra mutatott eltérő áteresztőképességét, akkor azt találjuk, hogy az emberi izom- és idegsejtekben a beállt egyensúly mellett mérhető, ún. nyugalmi potenciál értéke3 tipikusan -90 mV. A sejtek azonban nincsenek mindig egyensúlyban. Ha valamilyen módon (például mechanikai vagy elektromos ingerléssel) felborítjuk ezt az ionegyensúlyt, akkor drámai gyorsaságú öngerjesztő folyamatok fognak beindulni, melyek a másodperc törtrésze alatt teljesen megváltoztatják, majd vissza is állítják a nyugalomban mért potenciál értékét. Ezt nevezzük akciós potenciálnak (AP). Az AP lényege, hogy a kezdeti ingerlés hatására kinyílnak a sejthártyában lévő gyors Na+ csatornák, aminek hatására (ne feledjük: kint nagyságrenddel nagyobb a Na+ koncentrációja!) elkezd „bezúdulni” a sejtbe a pozitív töltésű Na+ . Ez természetesen pozitív irányba tolja a sejtben mért kezdeti negatív potenciált (emiatt nevezzük ezt depolarizációnak ); a beáramló Na+ mennyisége sokszor ahhoz is elég, hogy a potenciálesésnek még az irányát is megfordítsa . Ennek csúcsán (mely akár +35 mV értékű is lehet), a Na+ -csatornák lezárnak és (esetleg némi késés, ún. platófázis után) K+ -csatornák nyitnak ki, melyek ellentétes töltésáramlást tesznek lehetővé: elkezd a bent nagy koncentrációjú K+ kifelé áramlani, pozitív töltéseket szállítva magával. Ez újra negatívba viszi a sejtben mérhető potenciált (ez a repolarizáció), aminek hatására (néha kis túllövés, az utóhiperpolarizáció után) beáll az eredeti nyugalmi potenciál. Az egész jelenség általában néhány ms alatt lezajlik. Mindezeket mutatja az 1. ábra.
1. ábra. Akciós potenciál (AP) lefutása Az ábrán az AP időbeli lefutásán kívül látjuk az ionkonduktanciák változását is. (Vagyis, hogy a sejthártya mennyire áteresztőképes az egyes ionokra nézve.) Látható, ahogy az AP kezdetekor 3 Ez az érték kvantitatíve is számítható elektrokémiai megfontolások alapján. Az ezt leíró összefüggés a Goldman– Hodgkin–Katz egyenlet.
3
kinyílnak a Na+ -csatornák, lehetővé téve a pozitívan töltött Na+ -ionok beáramlását, és látható, ahogy kis késleltetéssel kinyílnak a K+ -csatornák, aminek hatására pedig pozitívan töltött K+ ionok fognak kiáramlani, visszaállítva az eredeti potenciált. A két ionkonduktancia gN a+ /gK + aránya a kezdeti 0,01-ról a depolarizáció alatt több ezerszeresére nő, míg a repolarizáció alatt 0,001-ig csökken, hogy aztán visszaálljon az eredeti 0,01 körüli érték. Jelentőség Miért különösen fontos jelenség az AP? Mert a sejtek között a szó szoros értelmében képes terjedni ! Ha valahol beindul, akkor a lezajlása (arra alkalmas szövetben) elég ingerlést jelent a szomszédos sejteknek is, akik ilyen módon szintén ingerületbe jönnek, AP fut le bennük. Ez aztán gerjeszti az ő szomszédjaikat, ami aztán azok szomszédjait is és így tovább. (Az AP-n „átesett” sejtek szokásosan egy ideig ingerelhetetlen, refrakter állapotba kerülnek, mely meggátolja ezen gerjesztési lánc visszafelé terjedését.) Ez a mechanizmus két alapvető élettani eseménynek jelenti az alapját. Egyrészt, magyarázza az idegekben zajló impulzustovábbítást – idegrendszerünk sejtjeiben, az idegrostokban így terjednek az információk. Másrészt, alapját képezi az izomműködésnek is, ugyanis az izmok összehúzódását épp az ilyen AP-k váltják ki. (Azzal, hogy az idegsejtekben érkező elektromos impulzusok hogyan tevődnek át az izomba (ún. neuromuszkuláris transzmisszió), illetve, hogy az izomba behatolt elektromos impulzus milyen módon vált ki kontrakciót, most nem foglalkozunk.) Összefoglalva a fentieket: láttuk, hogy a sejteket határoló sejthártya igen eltérő összetételű folyadéktereket határol. A sejthártya rendkívül jól meghatározott anyagáramlásokat tesz lehetővé, melyek jellemzője a szelektív permeabilitás is. Ennek hatására a szigetelő sejthártya két oldala között potenciálkülönbség épül ki, melynek nyugalmi értéke emberi izom- és idegsejtekeben -90 mV körüli. Ingerlés hatására ez a potenciál változásokat szenved: nagyon rövid idő alatt megszűnik, vagy akár pozitív értékű lesz, majd visszaáll eredeti szintjére. Ezt a jellegzetes feszültségváltozást nevezzük akciós potenciálnak (AP). Az AP jelentőségét az adja, hogy képest sejtek között tovaterjedni, így alapját képezi idegrostok működésének és az izomtevékenységnek is (hiszen az izomrostok kontrakcióját elektromos impulzusok tudják kiváltani).
1.2. A szív és elektromos aktivitása Keringési rendszerünk központi szerve és elsőrendű aktív tényezője a szív (cor). Mintegy 300 g súlyú, izmos falú, üreges szerv, mely a két tüdőfél által közrefogott mediastinum elülső részének, a mediastinum anteriusnak a legalján, a diaphragmával közvetlen érintkezésben található. Funkciók és működés A szív elsődleges (bár a közhiedelemmel ellentétben nem kizárólagos) funkciója, hogy ritmikus összehúzódásaival és elernyedéseivel folyamatos mozgásban tartsa egyik legfontosabb testfolyadékunkat, a – felnőtt férfiban mintegy 5-5,5 liternyi – vért. A vérkeringés életfontosságú funkció: teljes hiánya másodperceken belül eszméletvesztést4 , perceken belül (biológiai) halált5 okoz. Nem véletlen tehát, hogy a szívverés évezredek óta az élet szimbóluma. Szívünk mechanikai szempontból két független (bár csatolt működésű) pumpának tekinthető. E két pumpa (azaz két szívfél) mindegyike egy főpumpából (kamra, ventriculus) és egy előtöltő szerepű pumpából (pitvar, atrium) áll, hogy a mérnöki analógiát továbbvigyük. A működést úgy képzelhetjük el, hogy a kamrák összehúzódásakor (tehát pulzatilis módon) továbbítódik a vér a véredényrendszerbe. Az abból visszaérkező vér a pitvarokban gyűlik, melyek kontrakciója kevéssel megelőzi a kamrák összehúzódását – ez biztosítja, hogy a visszaérkezett vér mind teljesebb mértékben átkerüljön a kamrába, ahonnan a következő kör megtételéhez „útnak fog indulni”. A vér megfelelő irányban történő áramlását „szelepek”, azaz billentyűk biztosítják. Ilyen billentyű található a pitvarok és kamrák között (két- és háromcsúcsú vitorlás billentyű, valva bicuspidalis et tricuspidalis), mely biztosítja, hogy a pitvarok kontraciójakor a vér átjuthasson a kamrába, 4 Ennek oka, hogy az agyunk – tápanyagfelvételi képességeinek igen speciális voltából fakadó folyamatos tápanyagigénye miatt – csak rendkívül korlátozottan képes tolerálni, ha vérellátás nélkül marad. 5 A kettő közti időben a beteg a klinikai halál állapotában van. Ezalatt heroikus beavatkozásokkal elvileg elérhető a kiesett funkciók mesterségesen történő (legalább részleges) pótlása, mely a visszafordíthatatlan halál bekövetkeztetét elodázhatja – az ezzel párhuzamosan alkalmazott adekvát terápia pedig visszaadhatja az élet reményét.
4
azonban a kamrák kontrakciójakor ne juthasson vissza a pitvarokba. A nagyerek kezdeténél pedig félhold alakú (semilunaris) billentyűk vannak, melyek lehetővé teszik a vér ejekcióját a kamrákból, de megakadályozzák, hogy diasztolében visszafolyjon oda a vér. E két pumpa tehát két, anatómiailag független keringési körben mozgatja a vérünket: egyrészt a nagyvérkörben (szisztémás keringés), mely tápanyagokat juttat sejtjeinkhez és salakanyagokat szállít el tőlük, valamint a kisvérkörben (tüdőkeringés6 ), mely lehetővé teszi a CO2 -ben dús és O2 -ben szegény vérnek, hogy a CO2 -ot leadja, az O2 -ben pedig feldúsuljon. A jobb oldali7 az ún. vénás szívfél. Az ezen az oldalon lévő pitvarba érkezik testünk vénás vérének túlnyomó része (v. cava inf. és sup.), és az itteni kamrából megy a tüdő felé (truncus pulmonalis, majd a. pulmonalis sinistra et dextra). A bal szívfél pitvarába érkezik ennek megfelelő a tüdőből a vér (vv. pulmonales) és kamrájából indul a szisztémás keringésbe (aorta). Mindezeket összefoglalóan szemlélteti a 2. ábra.
2. ábra. Szív sematikus ábrája, különös tekintettel a véráramlás útjaira Világos, hogy ezen funkciók betöltéséhez nagy „erejű” pumpákra van szükség. Ne feledjük, hogy a bal szívfélnek kb. 100 mmHg nyomás ellenében kell pumpálnia – mégpedig átlagosan 5 liter vért percenként! Ezt a szív nagy tömegű, speciális felépítésű izmozata teszi lehetővé. Ennek egyértelmű következménye az is, hogy ezen szívizomzat károsodása a pumpafunkció romlásához vezet és ilyen módon életet fenyegető állapotot is okozhat! Elektromos aktivitás A szívizomzat összehúzódásait, mint testünk bármely más izmáét, elektromos impulzusok hozzák létre. Ezen elektromos impulzusok forrása a szíven belül található (az ingerülettermeléshez nincs szükség külső idegi behatásra); normális körülmények között az ún. sinus-csomó (sinoatrialis- (SA-) vagy Keith–Flack-csomó), mely ritmikus öngerjesztésre képes. Ennek lényege, hogy periodikusan (egészséges emberben kicsit sűrűbben mint másodpercenként) egy AP indul be benne, és terjed tova. A szívben ugyanis az összehúzódások során kifejtett munkáért felelős ún. munkaizomrostok mellett egy külön ingerületvezető rendszer is található, mely ezeket az elektromos impulzusokat továbbítja. Először befutja a pitvarokat az impulzus (kiváltva a pitvarok kontrakcióját), után az atrioventricularis (AV-) csomóba jut, ahonnan a His-kötegen keresztül 6 Természetesen
a tüdő kap nutritív ellátást is – ezt a jelenséget nevezik a tüdő kettős vérellátásának. egészséges emberben jobb oldali. Az érdekesség kedvéért megjegyzem, hogy egy ritka genetikai rendellenességben, a situs inversus-ban a zsigeri szervek jórésze a típusos helyéhez képest a sagittalis síkra tükrözve található. . . 7 Legalábbis
5
terjed a kamrák felé. (Ennek során az itteni lassabb vezetés miatt késleltetést szenved, ez teszi lehetővé, hogy a pitvarok összehúzódása teljesen befejeződjön, mielőtt a kamráké megkezdődne.) A His-köteg a két kamrát elválasztó septumnál két ágra (Tawara-szárak) oszlik, melyek azután további oszlásokkal elérik a kamra teljes munkaizomzatát. Ezt az ingerképző- és vezető rendszert mutatja nagy vonalakban az 3. ábra.
3. ábra. A szív ingerképző- és vezető rendszerének áttekintése Talán a fenti (szándékoltan elnagyolt) leírás is tudta érzékeltetni, milyen kiterjedt elektromos jelenségek zajlanak le a szívben minden egyes szívciklus alatt. Itt érkezünk az elektrokardiográfia központi felismeréséhez: vegyük észre, hogy a szív egy alapvetően vezető közegben van „ágyazva”, így ezen elektromos aktivitásnak a testfelszínen is észlelhetőnek kell lennie!
1.3. A gyakorlati elektrokardiográfia alapjai A fenti elvi megállapítást Willem Einthoven holland orvos ültette át a gyakorlatba. Vízzel töltött tartályokat használva „elektródaként” és speciálisan módosított galvanométert regisztrálóként (4. ábra) sikerült rögzítenie a szív elektromos aktivitását: berendezése a mérési pontok közötti feszültségek időfüggvényét rajzolta papírra. (Mindezért Einthoven 1924-ben orvosi Nobel-díjat kapott.) Einthoven bizonyos alapvetései a mai napig élnek az elektrokardiográfiában. Ezek közül is a legfontosabb az Einthoven-háromszög elve. Einthoven azzal a közelítő feltételezéssel élt, hogy a szív egy egyenletesen vezető közegben van, ezért az elvezető elektródákat a két kézre és a bal lábra felrakva egy jó közelítéssel egyenlő oldalú háromszöget képeztünk az elvezetésekből. Namármost, ha figyelembe vesszük, hogy a szív minden pillanatban egy dipólussal helyettesíthető, világos, hogy az elvezetések ezen dipólus (mint vektor) háromszög oldalaira eső vetületeit mérik. (A dipólussal helyettesítés azért indokolt, mert működés közben mindig a szív egy összefüggő része depolarizált és egy másik összefüggő része repolarizált.) Einthoven ezen elvét a mai elektrokardiográfia is változatlan tartalommal használja. (A fentiekből az is egyértelmű, hogy a három klasszikus elvezetés között igazából csak két lineárisan független van.) Mai EKG-berendezések Mára természetesen igen sokat változott az EKG-készülékek felépítése. Einthoven eredeti, többmázsás készülékéhez képet a mai EKG-k hordozhatóak (akár extrahospitálisan is), kezelésükhöz és az eredmények kiértékeléséhez egyetlen ember is elég, a vizsgálat maga tökéletesen non-invazív, fájdalommentes, azonnal eredményt szolgáltató, kockázatról nem beszélhetünk, az egy vizsgálatra eső költség pedig szinte nulla. Mindezek az EKG-t – száz évvel első alkalmazása után is – a belgyógyászati diagnosztika megkerülhetetlen részéve teszik.
6
4. ábra. Willem Einthoven korai EKG-berendezése Manapság hozzávezetésként vagy acél szívóelektródákat, vagy egyszerhasználatos Ag/AgCl elektródákat (orvosi becenevén: tappancs) használnak. Az EKG-berendezés maga általában precíziós mérőerősítőt jelent, melyet egy DC-leválasztás és egy műveleti erősítővel megvalósított főerősítés követ. A mai EKG-k természetesen számtalan kiegészítő megoldást alkalmaznak a pontosság, illetve biztonság növelésére: páciens túláramvédő áramkörök, bemeneti RF-szűrés, áramkörileg realizált felüláteresztő szűrés a kimeneten, A/D konverzió stb. Minden mai EKG fontos részét képezi a közösmódusú jelelnyomást jelentősen megnövelő aktív testpotenciál meghajtás8 is. Elvezetések Természetesen az idők során a vizsgált elektróda-elhelyezések (ún. elvezetések ) köre is bővült. Az elvezetések egyedi azonosítót kaptak, Einthoven három klasszikus elvezetése lett az I, II és III. Ezek bipoláris elvezetések, hiszen közvetlenül két elektróda potenciáljának különbségét vizsgálják. Képezzük az ezen a pontokon mért potenciálok átlagát valamilyen villamos módon (például az elektródák azonos, tipikusan 5 kΩ-s ellenálláson keresztül történő összekötésével); az így kapott pont a Wilson-féle centrális terminális (CT). Ha ehhez viszonyítunk9 potenciálokat (tehát nem potenciálokat közvetlenül egymáshoz), akkor unipoláris elvezetésről beszélünk. Például viszonyíthatjuk az egyes végtagi elvezetések potenciálját a CT-hez, ezeket az unipoláris elvezetéseket nevezzük Goldberger-féle, vagy augmentált elvezetéseknek. Ezek nevei rendre aVR, aVL és aVF (bal kéz, jobb kéz, bal láb viszonyítása). Szigorú értelemben véve ez a három elvezetés semmilyen plusz-információt nem hordoz, hiszen csak az eredeti három potenciálérték kivonásaival és összeadásaival kapott értékek „szinonimái”. Mégis, gyakorlati előnyei miatt, ez is részét képezi a standard EKG-elvezetéseknek. 8 Minden egészségügyi mérnök gyors ellenőrző kérdése a kardiológusához: mire használja a fekete elektródát? (Tudniilik a jobb lábra menő, amiről semmilyen elvezetéshez nem érkezik információ. Akkor minek is? Jelen sorok szerzőjének tapasztalatai szerint ez a kérdés komoly zavart képes kelteni. . . ) 9 A „viszonyítás” értelemszerűen azt jelenti, hogy a két viszonyított pont közti potenciálkülönbséget, azaz feszültséget mérjük valamilyen módon, például erősítő felhasználásával.
7
Végül további fejlődés eredményeképp egészült ki 12 elvezetésesre a repertoár: a maradék 6 ún. mellkasi elvezetés, melyek jellemzője, hogy a CT-hez viszonyítják10 a mellkas 6, jól meghatározott, nagyjából horizontális síkban fekvő anatómiai pontját. A nevük V1 , V2 ,. . . ,V6 . Előnyük, hogy egészen új információt szolgáltatnak, hiszen a szívet jellemző dipólus horizontális síkba eső vetületeit mérik. A tárgyalt elvezetéseket összefoglalóan mutatja az 5. ábra.
5. ábra. A standard 12 elvezetéses EKG elvezetéseinek logikája
Az egészséges EKG A következő, 6. ábra egy II-es elvezetésben látható ideáltipikus egészséges EKG-t mutat. Mint már láttuk, a szív elektromos impulzusai először a pitvarokat érik el, aztán tovaterjednek a kamrákra. Szintén láttuk, hogy azon szövetek, amiket elér az AP, először depolarizálódnak, majd nemsokára repolarizálódnak. Az EKG-n látható jellemző kitéréseket hullámoknak nevezzük. A P-vel jelölt hullámot a pitvarok depolarizációja okozza, a QRS-komplexumok feleltethetőek meg a kamrák depolarizációjának, míg a T-hullám a kamrák repolarizációjának. (Felmerülhet a kérdés, hogy a pitvari repolarizáció miért nem látható az EKG-n. Ennek az az egyszerű oka, hogy időben egybeesik a QRS-komplexummal, ami – lévén jóval nagyobb – egyszerűen eltakarja.)
1.4. Az infarctusról Mivel már volt róla szó, hogy a sejtjeink hogyan jutnak tápanyagokhoz a szisztémás keringésből (sőt, még a tüdő kettős vérellátása is szóba került), teljes joggal adódik a kérdés, hogy vajon a szív maga honnan jut vérellátáshoz. Elsőként rögzítsük, hogy a laikus szemmel logikusnak tűnő válasz rossz: csak a szív legigénytelenebb szövetei (az endocardium felületes rétegei, billentyűvitorlák stb.) képesek magából a szívben áramló vérből táplálkozni. A szív vérellátása Minden más szövet (ideértve tehát a szívizomzatot is!) tápanyagellátását egy külön véredényrendszer, a szívkoszorúerek (coronariák) biztosítják. Ezek az aorta kezdeti szakaszán ágaznak ki (a jobb és a bal elülső sinusból), majd három nagyobb ágra oszlanak. A három ramus aztán számtalan kisebb érre oszlik, melyek sokkal szétszórtabb vénás rendszerben szedődnek össze. (A vér nagy része végül a sinus coronariuson keresztül a jobb pitvarba ömlik, de kisebb vénák, a vv. minimae cordis-ok révén minden üregbe kerül vénás vér.) A szívkoszorúerek oszlását és lefutását mutatja nagy vonalakban a 7. ábra. 10 Tehát
ezek is unipoláris elvezetések.
8
6. ábra. Ideáltipikus egészséges EKG Einhoven II-es elvezetésben A lefutás jellegzetességeiből számunkra most az a legfontosabb, hogy a coronaria egyes artériás ágai egymással alig közlekednek, vagyis kevés anastomizáló artéria található közöttük. Ez azt jelenti, hogy az egyes coronariaágak funkcionális végartériának tekinthetők, aminek egyenes következménye, hogy kiesésük esetén más artéria nem tudja a funkciójukat átvenni. Más szóval: ha valamilyen oknál fogva egy coronariaág keringése megszűnik vagy leromlik, akkor az általa ellátott terület vérellátása is óhatatlanul romlani fog. Az AMI Itt kerül képbe egy újabb tényező. A szívizomzat energiaigényének fedezéséhez alapvetően a vérben szállított glukózt (vércukrot) használja fel. Szemben azonban a vázizmokkal, azt igen kis mértékben képes csak raktározni, azaz kicsi a glikolitikus kapacitása. Ennek logikus folyománya, hogy működéséhez folyamatos vérellátásra van szüksége. Ennek hiánya (ischaemia) esetén egyrészt nem képes szokásos munkavégzését folytatni, másrészt – ami ennél is nagyobb baj – a szövetekben jellegzetes degradációs folyamat, szövetelhalás indul be, mely egy ponton túl már visszafordíthatatlan. Az ennek talaján kifejlődő szívizom elhalás heveny formáját nevezzük akut myocardialis infarctusnak (AMI). (A glikolitikus kapacitás jóval magasabb volta a legfontosabb oka annak, hogy vázizom infarctus lényegében nem11 létezik.) A szöveti necrosis helyén hegszövet alakul ki, mely a szívizomzat végleges károsodását jelenti. Az AMI-ben bekövetkező akut halálozások többségért a ritmuszavarok (pl. VF/VT), a hemodinamikai instabilitás és a mechanikus szövődmények (pl. falruptura) felelnek. Az AMI jelentőségét nehéz lenne alábecsülni, hiszen a fejlett világon mindenütt a vezető halálokok egyike. Magyarország helyzete különösen aggasztó. 2004-ben az ischaemiás szívbetegségek (ISzB) standardizált halálozási rátája 233,6 volt hazánkban (per 100 000), vagyis több mint 20 ezer honfitársunk vesztette életét emiatt. Mindez azt jelenti, hogy az ISzB önmagában a halálozások negyedéért felel! Ez a halálozási ráta majdnem háromszorosa(!) az EU15-ökének, azaz a régi EU tagállamokének, de még az újonnan csatlakozott államoknál is 50%-kal nagyobb! Különösen riasztó, hogy ez az adat Magyarországon 1970-ben 248 (per 100 000) volt, azaz a helyzet nemhogy 11 Bár
ezt Dr. House nyilván nem így fogalmazná meg. . .
9
7. ábra. Coronariák oszlása és lefutása nem javult, de még romlott(!) is 1970-hez(!) képest12 . AMI diagnosztikája A gyakorlatban az AMI diagnózisának felállítása a teljes klinikai kép, az EKG-leletek és a laborvizsgálatok együttes értékelése alapján lehetséges nagyfokú biztonsággal. Ebből számunkra az EKG értékelése a legfontosabb. Azok az eltérések, amiket az AMI okozhat az EKG-ban, igen jól leírtak. De tudnunk kell, hogy bár az AMI okozhat ilyen jellegzetes eltéréseket az EKG-n (és ezek megléte alátámasztja a diagnózist), a hiányuk nem cáfolja azt! Példának okáért, az egyik legjellemzőbb EKG-lelet AMI-ben az ST-szakasz elevációja/depressziója – mégis, irodalomi adatok szerint az AMI-k több mint 50%-ában ez nem észlelhető (non-ST elevációs MI, NSTEMI). Ha pontos arányaiban nem is, de minőségileg hasonló a helyzet a patológiás Q-hullám meglétével, R-redukcióval stb. is. Ezek (nem is bemutatása, inkább csak szemléltetése végett) a 8. ábrán láthatunk egy AMI-s betegről készült típusos EKG-felvételt. Érdemes megfigyelni az ST-szakasz elevációját, ami különösen II, III és aVF elvezetésekben kifejezett. Az orvos ezekből a jelekből következtethet AMI-ra, míg az eltérések elvezetések közötti megoszlása az infarctus helyére utalhat (amire mindjárt vissza is térünk). Számunkra mindezekből az a legfontosabb megállapítás, hogy az jól körülírható, hogy milyen morfológiai eltéréseket találunk az EKG-ban az AMI miatt – ha egyáltalán találunk ilyeneket. Az EKG-leletek értelmezése AMI gyanúja esetén nem kizárólag a gyanú megerősítésére vagy cáfolatára irányul. Fennálló AMI esetén ugyanis az EKG-lelet a legfontosabb azonnali eszköz annak meghatározására, hogy a szív melyik részét érintette az infarctus, hol található az elzárt ér, illetve az ischaemizálódott szövet. Ezt az információt nevezik az AMI (fali) lokalizációjának. A lokalizáció azért állapítható meg az EKG-ból, mert attól függően, hogy hol van a szíven belül az érintett terület, az elektromos tevékenység különböző vetületeit mutató különböző EKG-elvezetésekben más és más eltéréseket fogunk találni. Újra hangsúlyoznám, hogy EKG-t soha nem értékelünk klinikai kép nélkül, mégis: igazolt AMI-s beteg infarctus lokalizációjának meghatározása olyan feladat, mely pusztán EKG alapján 12 Az igazsághoz azért hozzátartozik, hogy az ISzB SDR-je más nyugati országokban sem javult úgy, mint például a születéskor várható élettartam, mert az életmód előnytelen változásai igen szívósan ellene dolgoznak az orvostudomány fejlődésének. . .
10
8. ábra. Tipikus AMI-ben készült 12 elvezetéses EKG-regisztrátum, szignifikáns ST-elevációval is jó eséllyel elvégezhető – ha az EKG-lelet egyáltalán kiértékelhető, akkor általában a klinikai gyakorlatban is ezt végzik el. Kissé más szemüveggel nézve erre: az EKG lényegében nem más, mint egy számsor, amit a klinikusok „végigolvasnak”, majd egy értéket rendelnek a számsorhoz (meghatározzuk a lokalizációt). Így felfogva a kérdést, rögtön adja magát a konklúzió: ez ideális feladat lesz a neurális hálók számára!
2. A feladat megfogalmazása, a neurális hálókkal történő megoldás megfontolásai A megoldandó feladat tehát: akut myocardialis infarctuson átesett alanyok EKG-regisztrátumaiból az infarctus lokalizációjának automatikus meghatározása számítógéppel, mesterséges neurális hálózatok alkalmazásával. A neurális hálózatokat a mesterséges intelligencia jelenlegi legerőteljesebb eszközei között találjuk. A módszer elvi megalapozottsága nagyon jó, problémamegoldóképességét a gyakorlat számtalan területén bizonyította osztályozástól a mintafelismerésig, approximációtól idősorok előrejelzéséig. Számunkra most a legfontosabb a neurális hálók osztályozási képessége. Tegyük fel, hogy rendelkezésünkre áll objektumok egy halmaza, amelyben az objektumok – valamilyen jellegzetességük alapján – több osztályba sorolhatóak be. Ha kellően sok objektum–osztály párt ismerünk (azaz objektumokat a helyes besorolásukkal együtt), akkor reményünk van arra, hogy olyan neurális hálót konstruáljunk, mely képes általában osztályozni ilyen objektumokat. Vagyis: a meglevő, ismert osztályozású objektumokat mintaként megadva, a háló „rátanul” a minták tulajdonságaira, azokat általánosítja, így később olyan objektumokat is helyesen tud osztályozni, amiket a tanulási folyamat során nem is látott – hiszen a tanítás lényege épp az volt, hogy a neurális háló „rájöjjön”, mik azok az absztrakt tulajdonságai az objektumoknak, ami alapján csoportokba soroltuk őket, ezeket a tulajdonságokat leszűrje és megjegyezze, majd később felhasználja az új objektumok osztályozásához. A dolog igazi szépsége abban rejlik, hogy nekünk nem kell megadnunk (sőt, még csak tudnunk sem kell róla), hogy pontosan milyen tulajdonságuk alapján tartozonak az objektumok az egyes csoportokba. Kellően sok mintát megadva a neurális hálónak, az magától „rá fog jönni” erre, és később a teljesen új mintákat is jól fogja osztályozni. 11
(A neurális hálók egyik legnagyobb hátránya történetesen épp az, hogy a tudásukat nem tudjuk emberi formában interpretálni – lehet, hogy kivételesen jól végez egy háló egy osztályozási feladatot, de soha nem fogjuk megtudni, hogy pontosan „mit is figyel” az osztályozásnál.) A tanításnak azt a formáját, amikor rendelkezésre áll minták egy halmaza, és minden egyes mintához a helyes, elvárt osztálybasorolás is, ellenőrzött tanításnak nevezzük. A minták halmazát tanítókészletnek hívjuk. Nézzük mindezek hogyan hasznosíthatóak a mi feladatunkban! Az osztályozandó objektumok esetünkben EKG-regisztrátumok lesznek, az egyes osztályok pedig a különféle lokalizációk. Biztos tehát, hogy a konstruálandó neurális hálónk bemenetként EKG-felvételeket kell, hogy kapjon, kimenetként pedig a megfelelő fali lokalizációt várjuk.
3. Adatok előfeldolgozása Ezzel elérkeztünk talán a dolgozat legfontosabb részéhez. Már kijelöltük, hogy pontosan mi az a feladat, amit neurális hálók alkalmazásával kívánunk megoldani és alaposan megismertük ennek orvosi hátterét is. Az is világossá vált a feladat meghatározásakor, hogy megoldásához szükségünk lesz (lehetőleg nagymennyiségű) feldolgozható formában rendelkezésre álló, megfelelő adatokat (így a valós lokalizációt is) tartalmazó AMI-s EKG-regisztrátumokra. A most következőkben ennek „beszerzését” és feldolgozását fogjuk lépésről-lépésre nyomon követni. Látni fogjuk, hogyan lesz az Interneten elérhető, nem megfelelő formátumú, sok helyre szétosztott, a szükséges adatokat nehezen hozzáférhető módon tároló adatbázisból olyan adatállományunk, mely közvetlenül megadható egy neurális hálónak (egy kényelmesen használható környezet, a Matlab programcsomag alatt).
3.1. Nyers adatok beszerzése Első lépésben szükségünk van tehát olyan EKG-felvételekre, melyekkel neurális hálónkat taníthatjuk. Erre a célra AMI-s betegekről készült regisztrátumok kellenek, melyekhez hozzá tudjuk rendelni az infarctus lokalizációjának biztos helyét is. (Hiszen, mint arról már szó volt, ellenőrzött tanítású hálót akarunk létrehozni, amihez összetartozó bemenet – elvárt kimenet, esetünkben: EKG-regisztrátum – AMI lokalizációja párokra van szükségünk.) Honnan szerezzünk ilyen regisztrátumokat? Szerencsére az Interneten számtalan EKG adatbázis érhető el a nagyközönség számára is. Az ilyen adatbázisok legfontosabb gyűjtőhelye a www. physionet.org weboldal. A PhysioNet-et 1999-ben alapították amerikai egyetemek, azóta több nemzeti intézet támogatását is begyűjtve dolgozik élettani jelek és kapcsolódó adatok nyilvános adatbázisokban való gyűjtésén, az ezek kezelését lehetővé tevő programok fejlesztésén és kapcsolódó szakirodalmak nyilvános megosztásán. Legkiterjedtebb az EKG gyűjteménye, mely többek között a legendás MIT-BIH adatbázis részeit is tartalmazza. A mi feladatunk megoldásához olyan adatbázisra van szükségünk, mely AMI-s betegek 12 elvezetéses13 EKG-it tartalmazza, mellékelve az egyes regisztrátumokhoz az infarctus fali lokalizációját. Áttekintve az PhyisioNet adatbázisait, hamar megtaláljuk amire szükségünk van: a PTB Diagnostic ECG Database adatbázist. Ezt a német mérésügyi hivatal, a Physikalisch-Technische Bundesanstalt (PTB) állította össze kutatási, benchmarking14 és oktatási célokra; az adatokat a berlini Benjamin Franklin Klinika Kardiológiai Osztályán gyűjtötték. Összesen 294 alany 549 regisztrátumát tartalmazza. Az alanyok közül 148 diagnózisa volt AMI, 54 volt egészséges kontroll, a maradék egyéb kardiológiai rendellenességben (cardiomyopathia, szárblokk, stb.) szenvedett. A felvételek rendkívül jó minőségűek : 1 kHz-es sávszélességűek, a mintavételezés 16 bites felbontással történt, a maximális zaj 10 µV peak-to-peak. Ezek a jellemzőek messze meghaladják a legtöbb klinikai gyakorlatban használatos EKG paraméteit. Az adatbázis értékét növeli a hihetetlenül részletes klinikai annotáció: a 13 A
továbbiakban az elvezetés és a csatorna szavakat szinonimaként fogjuk használni. újonann kifejlesztett EKG-feldolgozó algoritmusok teljesítményének minősítése.
14 Például:
12
gyógyszerezéstől az echocardiographia eredményén át a páciens dohányzási szokásaiig szinte minden lényeges paramétert megtalálunk - így az infarctus fali lokalizációját is. Ebből az adatbázisból fogunk kiindulni! Az adatbázis a www.physionet.org/physiobank/database/ptbdb/ címen érhető el. Sajnos minden egyes páciens adatai külön mappában találhatóak, ami számunkra igen kényelmetlen, hiszen mi a fájlokat kötegelten15 szeretnénk majd feldolgozni – szerencsésebb lenne, ha mindegyik egyetlen mappában lenne elérhető. Jobb, ha erre a problémára már a letöltéskor gondolunk! Éppen ezért a letöltéshez használt wget programot olyan módon paramétereztem, hogy a fenti kiinduló URL alapján rekurzíve látogassa meg az alkönyvtárakat (ezekben találhatóak az egyes páciensek adatai), azonban ezeket a fájlokat „ömlesztve” töltse le: mindegyiket egyetlen helyre, a könyvtárstruktúra felépítése nélkül. E:\ptb>c:\downloads\wget-1.10.2b\wget.exe --output-file=wget_log.txt --verbose --no-directories --recursive --level=2 --no-parent http://www.physionet.org/physiobank/database/ptbdb/ Ha ezzel megvagyunk, az E:\ptb könyvtárban megkapjuk az összes elérhető állományát a PTB adatbázisnak – összesen több mint 2 GB nagyságban! Ezen fájlok három csoportba oszthatóak kiterjesztésük (és így tartalmuk) alapján: .dat Ezek tartalmazzák a 12 elvezetés nyers adatait a PhysioNet szabványosított Format16 adatformátumában. .hea Ezek tartalmazzák a fejlécadatokat: a nyers adatok értelmezéséhez szükséges információkat (formátum, mintavételi frekvencia stb.), valamint az adatok klinikai annotációját. .xyz Ezek különleges elvezetések (a Frank-féle XYZ-elvezetések) adatait tartalmazzák, amire nekünk most nem lesz szükségünk. Értelemszerűen egy adott fájlnévhez tartozó három – különböző kiterjesztésű – fájl ugyanazon regisztrátum adatait tartalmazza.
3.2. Nyers adatok Matlab környezet alá importálása, formátumkonverzió Az első feladat nyilván az adatok beolvasása Matlab környezetbe, ahol további feldolgozásukat végezni fogjuk. A PhysioNet szoftverkönyvtárában természetesen találunk alkalmazást, mely képest értelmezni a Format16 formátumot, ez az rdsamp.exe. Bemeneti paraméterként várja a feldolgozandó fájl nevét (kiterjesztés nélkül), kimenetként pedig megadja ennek tartalmát ASCII szövegfájlként. (Alapbeállításként az adatokat a standard output-ra írja, ezt a kacsacsőr operátorral irányíthatjuk fájlba. Úgy döntöttem, hogy a kimeneti fájlnév legyen a bemenővel egyező, de a szöveges fájllá konvertált adatok kiterjesztése legyen .txt) A szövegfájl 17 oszlopban tartalmaz adatokat: az elsőben vannak a sorok sorszámai, a következő 12 az adott sorszámhoz tartozó időpontban16 a megfelelő – 12 elvezetéses – EKG-csatornán mért érték, míg az utolsó 3 ugyanez, csak az XYZ-elvezetésekben. A szöveges fájl fenti formátumát a 9. ábra mutatja. Mivel ez már nem bináris, hanem szöveges állomány, így gond nélkül be tudjuk olvasni Matlab-ba is, erre szolgál a dlmread parancs. Megadva neki a beolvasandó szövegfájl nevét, és az adatokat benne elválasztó karaktert (esetünkben: tabulátor) kimenetként adja a beolvasott17 adatokat tartalmazó immár Matlab alatti tömböt (10. ábra). 15 Azaz: elkészítjük az egyetlen fájlt feldolgozó függvényt, amit csak meghívunk a mappa összes fájljára. Ehhez viszont nyilvánvalóan egy mappában kell lenniük a feldolgozandó fájloknak. 16 Mivel az adatokat 2000 Hz-en mintavételezték, így egyetlen másodperc lezajlása 2000 sort jelent a szöveges fájlban, azaz a sorszámhoz tartozó valós időpontot értelemszerűen úgy kapjuk, hogy a sorszámot elosztjuk 2000-rel. 17 A dlmread működése igen logikus: a beolvasott szöveges fájl minden egyes új sora új sor lesz a Matlab mátrixban is; új oszlopot pedig ott kezd, ahol a paraméterként megadott elválasztó-karakterrel találkozik.
13
9. ábra. A bináris adatok szöveggé történő konvertálás után Foglaljuk össze az eddigieket! Az előzőekben meghatároztuk, hogy milyen nyilvános adatbázis regisztrátumait akarjuk használni, ezen adatbázis fájljait letöltöttük a számítógépünkre, majd beolvastuk az adatokat Matlab környezet alá. Mivel az adatok beolvasását (majd később feldolgozását) minden fájlra el kell végeznünk, ezért logikus, ha írunk egy Matlab függvényt, mely adott nevű fájl beolvasását és kezdeti feldolgozását végzi. Ezen függvény megírásában jelenleg itt tartunk (a BeatLength paraméterrel egyelőre ne foglalkozzunk): 1
3
function [ ecgRaw , qrs , l e n ]= p r o c e s s ( f i l e n a m e , BeatLength ) t i c ; %i d ő m é r e s i n d u l dos ( [ ’ rdsamp . exe ’ , f i l e n a m e , ’ > ’ , f i l e n a m e , ’ . t x t ’ ] ) ; %l e f u t t a t j u k a kódot , ami a . d a t f á j l b ó l s z ö v e g e s f á j l l á a l a k í t j a az EKG−t data=dlmread ( [ f i l e n a m e , ’ . t x t ’ ] , ’ \ t ’ ) ; %b e o l v a s s u k m a t l a b b a a szöveges f á j l t Kihasználva, hogy az adatokat kényelmesen kezelhető formára hoztuk, nézzük is meg az eredményt! A 11. ábra mutatja mit kapunk, ha a Matlab-bal kirajzoltatjuk a beolvasott mátrix egy oszlopát, azaz egy EKG-elvezetés adatait. A jobb láthatóság érdekében vágjuk ki ebből az első 2000 mintapontot, azaz a felvétel első 1 mp-ét (12. ábra). Megnyugvással konstatálhatjuk, hogy az adatok Matlab környezet alá importálása sikerült, valóban a páciens EKG-ját látjuk!
14
10. ábra. A nyers adatok Matlab alatt Szívciklusok szétválasztása Rendelkezésünkre áll tehát egy tömb, mely oszlopaiban tartalmazza mind a 12 elvezetés adatait, másodpercenként 2000-szer rögzítve az adott elvezetés aktuálisan mért értékét. A neurális hálónk bemenete nyilván egyetlen szívciklus (természetesen több párhuzamos elvezetésben rögzített) adataiból fog állni. (Kevesebb szívciklust, azaz egy szívciklus töredékét megadva a hálónak értelemszerűen lényeges adat hiányozhat a feladat megoldásához, de egynél többet sincs értelme egyszerre megadni, hiszen egy második szívciklust érdemesebb egész egyszerűen egy következő tanítómintának tekinteni. Erre a kérdésre nemsokára jóval bővebben visszatérünk.) Mivel tehát a neurális hálónk bemenete egy szívciklus lesz, első lépésben meg kell határozni, hogy hol vannak az egyes szívütések. Ezt a feladatot hívják R-hullám detekciónak (vagy QRSdetekciónak), ez az EKG jelfeldolgozási feladatai közül a legklasszikusabb. Hatalmas irodalommal rendelkezik ez a kérdés, szinte minden létező digitális jelfeldolgozási algoritmust alkalmaztak már erre a célra: időtartománybeli elemzést (amplitúdó vizsgálata, abszolútérték vizsgálata, első, második és magasabbrendű deriváltak vizsgálata, a jel integrálása, ablakozott integrálása; valamint ezek kombinációi), frekvenciatartománybeli elemzést (a jel Fourier-transzformálása, short time Fourier-transzformálása, Hilbert transzformálása; valamint ezek kombinációi), párhuzamos időés frekvenciatartománybeli elemzést, mintaillesztést, szakértői rendszerek és mesterséges intelligenciájú eljárások alkalmazását, valamint ezek kombinációit18 . . . Mivel ez a kérdés a mi feladatunkban csak kiegészítő jellegű, ezért egy jó hatásfokú, nyilvános algoritmust használtunk fel, a Pan-Tompkins algoritmust. Ez bemenetként egy vektort vár (benne az EKG adataival), kimenetként megadja a benne detektált R-hullámok helyeinek sorszámát (vagyis a bemenő vektor azon 18 Mostanra körülbelül 97-98%-os eredményt tudunk elérni (mind specificitás, mind szelektivitás terén), és nagyon úgy tűnik, hogy ezzel le is zárult a fejlesztés: nem látszik remény a maradék néhány százalék megoldására.
15
11. ábra. A nyers adatok egy oszlopa, azaz egy elvezetés adatai indexeit, amelyeknél R-hullámot detektált). Ebből is nyilvánvaló, hogy nekünk ezt az algoritmust 12-szer kell lefuttatnunk – minden elvezetésre külön-külön, hiszen az R-hullámok pontos pozíciója kicsit eltérhet az elvezetések között. Ezen a ponton ki kell térnünk egy problémára. Az algoritmus bármilyen jó is, néha hibázik – nem ismer fel egy R-hullámot, vagy ellenkezőleg, például egy magas, csúcsos T-hullámot is Rnek „néz”. Ezt abból lehet rögtön észrevenni, hogy nem minden csatornában azonos a detektált szívütések száma. (Az rendkívül ritka, hogy 12 csatornában pont ugyanolyan módon tévedjen az algoritmus, ha ilyen elő is fordulna, azt nyugodtan tekinthetjük zajnak, így nem kell vele külön törődnünk.) Ha előáll ez a helyzet, akkor a kérdéses regisztrátumunk sajnos elveszettnek tekinthető. Mivel nem tudjuk, hogy a hibázás pontosan hol történt, így egyetlen szívciklus adatait sem használhatjuk fel, hiszen mi van, ha már előtte „elcsúsztunk”? A hiba felderítése algoritmikus eszközökkel bonyolult, és ha mindenképpen meg is oldanánk, akkor már egyszerűbb lenne eredményeinket magába az R-hullám detektáló algoritmusba beépíteni. Konklúzió: számunkra a járható út a lehető legjobb R-hullám detektáló eljárás alkalmazása, és hibázás esetén a regisztrátum eldobása. Mivel tehát minden csatornán ugyanannyi szívütést szeretnénk, a legegyszerűbb, ha először az I-es elvezetést felismertetjük, eltároljuk a detektált szívütések számát, majd egyesével végigmegyünk a maradék 11 csatornán, de úgy, hogy minden egyes csatorna felismertetése után ellenőrizzük, hogy a detektált szívütések száma egyezik-e az első csatornán számolttal. Ha igen, akkor a következő csatornára ugrunk, ha nem akkor rögtön abba is hagyhatjuk a munkát (a többi elvezetés detektáltatása felesleges) és a következő regisztrátummal folytatjuk. Lássuk hogyan alakul tovább a Matlab kódunk! Elsőként detektáltatjuk az első19 csatornát, lementjük a később majd referenciának használt szívütés-darabszámot és előkészítjük a tömböket, amiket a tároláshoz fogunk használni: 19 Ne
feledjük, hogy ez a data tömb második oszlopában van, hiszen az első a sorszámokat tartalmazza.
16
12. ábra. A nyers adatok egyik oszlopának első 2000 adata, tehát 1 mp-e
6
8
tempQrs=pan_tompkins ( data ( : , 2 ) ) ; %l e g e l s ő c s a t o r n a f e l d o l g o z á s a : s z í v ü t é s e k helyének meghatározása l e n=length ( tempQrs ) ; %e l s ő c s a t o r n á n s z á m o l t s z í v ü t é s e k e l t á r o l á s a ( k é s ő b b v i s z o n y í t á s i pont ) q r s=zeros ( 1 2 , l e n ) ; %s z í v ü t é s e k e t t a r t a l m a z ó tömb i n i c i a l i z á l á s a q r s ( 1 , : )=tempQrs ; %e l s ő c s a t o r n á n d e t e k t á l t s z í v ü t é s e k h e l y é n e k letárolása Mint látható, a qrs egy 2 dimenziós tömb (azaz mátrix), első dimenziójában tároljuk a csatorna sorszámát, a másikban pedig az ott észlelt szívütések időpontját. (Időpont alatt a minta sorszámát értve.) Mivel tudjuk, hogy pontosan hány szívütést kell tárolnunk, így a qrs tömböt nyugodtan lefoglalhatjuk előre. Következő lépésben elvégezzük a többi csatorna detektáltatását:
10
12
14
16
f o r j =3:13 %maradék c s a t o r n á k f e l d o l g o z á s a . . . tempQrs=pan_tompkins ( data ( : , j ) ) ; %s z í v ü t é s e k h e l y é n e k meghatározása i f ( length ( tempQrs )~=l e n ) %ha nem annyi s z í v ü t é s van , mint az e l s ő csatornában : hiba , e l d o b j u k ecgRaw=zeros ( 1 , 1 , 1 ) ; q r s=zeros ( 1 , 1 ) ; l e n =0; return ; end q r s ( ( j −1) , : )=tempQrs ; %ha v i s z o n t stimmel , a k k o r l e t á r o l j u k a szívütések időpontját 17
18
end Látható, hogy a felismert adatok egy átmeneti tárolóba, a tempQrs vektorba kerülnek, itt vizsgáljuk meg a hosszukat. Ha eltér a referenciaértéktől, akkor a függvény összes visszatérési értékét nullára állítjuk (a meghívó függvény innen fogja tudni, hogy sikertelen volt a fájl feldolgozása), és kilépünk. Ha nem, folytatjuk a következő csatornával, egészen addig, amíg nem végzünk mindegyikkel. Vegyük észre, hogy ezen a ponton megszabadulunk a zavaró 1. oszloptól, ami miatt a 12 elvezetést a data 2 és 13 közötti oszlopaiban találhattuk meg. Így itt a qrs tömb i-edik indexével már ténylegesen az i-edik csatornára20 hivatkozunk. Folytassuk tovább a feldolgozást! Ha eddig eljutottunk, akkor a qrs tömbben rendelkezésünkre állnak a szívütések helyeire vonatkozó információk: a qrs(i,n) megadja az i-edik csatornán az n-edig szívütés időpontját. A len változóból kiolvashatjuk, hogy hány szívütésünk van összesen. (Ami a mondottak értelmében természetesen az összes csatornára vonatkozik.) Újramintavételezés A következő feladat, hogy az egyes szívütéseket egymással összevethetővé tegyük. A gond az, hogy a szívünk kváziperiodikusan működik: bár az egyes szívütések hasonló hosszúságúak, kisebb-nagyobb eltérések21 vannak köztük. A másik probléma, hogy a különböző regisztrátumok szívütéseinek átlagos hossza nem egyezik (ahogy a páciencek szívfrekvenciája eltér), márpedig nekünk minden egyes regisztrátumot ugyanarra a neurális hálóra kell bemenetként adnunk. Mindezen problémák megoldását az egyes szívciklusok újramintavételezése jelenti. Ennek lényege, hogy bármilyen hosszú is az adott szívciklus, mi azt rögzített hosszúságúra normáljuk át. (Ezt szemléletesen, bár nem teljesen precízen úgy képzelhetjük el, mintha meghatároznánk az új mintavételi időpontokat, és ott a szomszédos igazi mintavételi pontokban mért értékeket interpolálva becsülnénk meg a mintavételezett értéket.) Szerencsére a Matlab (pontosabban a Signal Processing Toolbox-a), kínál egy függvényt pontosan erre a feladatra, ez a resample. Bemenetként várja az újramintavételezendő vektort, továbbá az annak megadását, hogy hány mintapontra szeretnénk áttérni. (Egész pontosan két egész számot vár bemenetként, p-t és q-t, a mintát pedig p/q-szorosára mintavételezi. Ez számunkra praktikus megközelítés: q-ban megadjuk a mintapontok jelenlegi számát, p-ben pedig a kívánt számát.) Itt ki is derül, hogy mi a feldolgozó függvény másik paraméterének jelentése: a BeatLength megadja, hogy hány mintapontra alakítsuk a szívütéseket. Az újramintavételezés hatását a 13. ábrán láthatjuk. A két grafikon ugyanazt a szívciklust mutatja, de a felsőt eredeti mintavételi frekvencián (amin 867 pont adja ki az egész ciklust) látjuk, míg az alsót 40 mintavételi ponton. A mintavételi pontokban mintavételezett értékeket jelölik a keresztek. Ezen a ponton döntenünk kell tehát arról, hogy milyen értéket is válasszunk BeatLength-nek. Döntésünket nyilván a Shannon-Nyquist mintavételi tétel korlátozza: eszerint (leegyszerűsítve) egy fs frekvenciával mintavételezett jelből legfeljebb az fs /2 frekvenciájú jelek állíthatóak vissza. (Ebből is adódik, hogy az eredeti adatok 1000 Hz-es sávszélességűek voltak. Hasonlóan: a CDminőségű hangot szolgáltató CD-n azért épp 44,1 kHz-en mintavételezve találjuk a hangot, mert a legtöbbünk füle kb. 22 kHz magasságig képes észlelni a hangokat.) Tudnunk kell, hogy a gyakorlatban alkalmazott EKG-k a 100. . . 150 Hz körüli tartományon vágják le a bemenőjelt. (E fölött már nincs hasznos információ22 az EKG-ban, a zajt meg nincs értelme átvinni.) Ez tehát 200. . . 300 mintát jelentene elvezetésenként (amiből ugye 12 van), ez megengedhetetlenül sok bemenő adat volna. Szerencsére erre nincs is szükség. Mert igaz ugyan, hogy egy modern EKG-nak illik átvinnie 100 Hz fölött is, hogy a jó szemű, gyakorlott kardiológus szakorvosok számára se vesszen el semmi információ, de az ezen a tartományon átvitt információ 20 Értve ezt úgy, hogy a csatornákat I, II, III, aVR, aVL, aVF, V ,. . . ,V sorrendben sorfolytonosan beszámozzuk. 1 6 Természetesen egy orvos soha nem hivatkozik például a V2 -re úgy mint „8. csatorna”. 21 De ne gondoljuk azt, hogy ezek jelentőség nélküliek, amik csak a „munkánkat nehezítik”! A szívütésről-szívütésre jelentkező ingadozások matematikai vizsgálata, a szívfrekvencia variabilitás (HRV) elemzése jelenleg is intenzíven kutatott terület, mert az eddigi eredmények alapján klinikai következtetések levonását is lehetővé teszi. 22 Kivételt képez az ún. kamrai utópotenciál, aminek vizsgálata azonban még nem képezi a klinikai gyakorlat részét, speciális EKG-berendezést igényel.
18
13. ábra. Az újramintavételezés hatásának szemléltetése csak minimális jelforma-változást okoz – olyan minimálisat, ami lehet, hogy nüansznyi különbségeket jelent például egy átvezetési zavar diagnosztizálásában, de egy AMI fali lokalizációjának meghatározására semmilyen hatással nincs. Mi tehát jóval lejjebb mehetünk a frekvenciával! Hogy még egy dologgal alátámasszam ennek jogosságát: gyártanak EKG-kat kardiológiai őrzőkbe (monitorizáláshoz), melyek 30. . . 40 Hz környékén levágják a jelet – ezt ugyanaz teszi lehetővé, mint amire én is hivatkoztam most: a finom részletekre nincs szükség. (Bár ott más okokból kifolyólag. Míg mi a mintapontok számát szerettük volna csökkenteni, addig ott a berendezés robosztusságát, zajtűrését23 emeli a kisebb frekvencia.) Irányadónak tekinthetjük, hogy mérések szerint a QRS-komplex energiatartalmának jó része a 12-16 Hz-es tartományba esik. (Márpedig ez meglehetősen nagy frekvenciájú része az EKG-nak.) Mindezek alapján úgy határoztam, hogy az áteresztést 20 Hz-ben korlátozom, azaz szívciklusonként 40 mintát veszek az EKG-adatokból. Ez természetesen csak akkor lenne 20 Hz, ha minden szívciklus pontosan 1 mp-ig tartana. Ennél a szívciklusok jellemzően rövidebbek (a páciensek pulzusa általában bőven magasabb 60nál. . . ), így – mivel a rövidebb szívciklusokra is 40 mintavételi pont jut – csak növeljük a tényleges 23 Egész pontosan az nagyon fontos, hogy 50 Hz alatt van a vágási frekvencia, így meg lehet szabadulni a manapság is egyik legnagyobb gondot jelentő hálózati interferenciától. Egy ilyen alkalmazásban ez sokkal fontosabb, mint az apró részletek a hullámformán, amit úgysem használnának fel.
19
mintavételi frekvenciát. Azaz: a kisebb hiba irányába tévedünk. Térjünk vissza a feldolgozó algoritmushoz, és fejezzük is be! Nincs más hátra, mint minden egyes csatornán elkülöníteni egymástól a szívütéseket, mindegyiket ugyanolyan hosszúra normálni és külön tömbbe tárolni: ecgRaw=zeros ( BeatLength , l e n −1 ,12) ; %az n y e r s EKG−t t a r t a l m a z ó tömböt i n i c i a l i z á l j u k f o r j =1:12 %minden EKG−c s a t o r n á t f e l d o l g o z u n k . . . f o r i =1: l e n −1 %a s z í v ü t é s e k darabszáma a l a p j á n v é g i g l é p k e d ü n k minden s z í v c i k l u s o n . . . ecgRaw ( : , i , j )=r e s a m p l e ( data ( q r s ( j , i ) : q r s ( j , i +1) , j +1) , BeatLength , q r s ( j , i +1)−q r s ( j , i ) +1) ; %ú j r a m i n t a v é t e l e z z ü k a c i k l u s t BeatLength h o s s z ú s á g ú r a end end toc ; %i d ő m é r é s m e g á l l
20
22
24
26
end A kiemelt és azonos hosszúságúra normált szívütések kerültek az ecgRaw tömbbe. Első indexe jelöli ki a szívütésen belüli időpontot (1. . . BeatLength), a második index a szívütés sorszámát az egész regisztrátumon belül (1. . . (len-1)), a harmadik pedig a csatornát (1. . . 12). A teljes munkafolyamatot szemléleti a 14. ábra. A tic és toc utasítások szerepe, hogy a felhasználó visszajelzést kapjon arról,hogy mennyi ideig tartott egy fájl feldolgozása. Ezzel minden szükséges visszatérési értékünk megvan: a len tárolja a szívütések darabszámát, a qrs a pontos helyüket csatornánként, a ecgRaw pedig csatornánként és szívütésenként az egyes szívciklusok adatait BeatLength pontban. Összefoglalva tehát: elkészültünk azzal a szubrutinnal, mely egy adott (eredetileg a PhysioNetről letöltött) fájlt teljes egészében feldolgoz. Ha a detekció sikeres, akkor szívciklusokat külön-külön megkapjuk. A következő feladat, hogy ezt egyrészt az összes letöltött fájlra lefuttassuk (egyetlen függvényhívással, hiszen nyilván nem szeretnénk több százszor kézzel meghívni ezt a feldolgozó rutint. . . ), valamint, hogy az egyes fájlokhoz kinyerjük a pontos értékelésüket. Ez már csak azért is szükséges, mert azokkal a fájlokkal, amelyek nem AMI-s betegekről készültek, nem kell törődnünk, azaz a fenti feldolgozásuk is felesleges. Fejlécállományok feldolgozása Kezdjük tehát ez utóbbi funkcióval! A szükséges adatok kinyeréséhez nyilván a .hea fejlécállományokat kell beolvasnunk – készítsünk tehát egy külön függvényt erre a célra. Függvényünk mindössze a beolvasandó fájl nevét várja: function code=h e a d p a r s e ( f i l e n a m e ) Nyissunk meg egy fejlécállományt, hogy megismerkedjünk a szerkezetével (15. ábra)! Az ábrán minden számunkra szükséges adat látható. A páciens diagnózisát a # Reason for admission: kezdetű sorban találjuk, az AMI lokalizációját (ha egyáltalán AMI-je van), az # Acute infarction (localization): kezdetű sorban. A Matlab alatti feldolgozáshoz tehát nincs más dolgunk, mint egyesével végigolvasni a sorokat, ezt a kettőt keresve:
2
4
6
f i d=fopen ( f i l e n a m e , ’ r t ’ ) ; % f e j l é c f á j l m e g n y i t á s a tempcount =0; while ( ( f e o f ( f i d ) == 0 ) && ( tempcount~=2) ) %amíg nem érünk a f á j l v é g é r e , vagy nem o l v a s t u k k i mind a k é t s z ü k s é g e s a d a t o t . . l i n e=f g e t l ( f i d ) ; %s o r o n k é n t i b e o l v a s á s a f e j l é c á l l o m á n y b ó l i f ( f i n d s t r ( lin e , ’# Reason f o r a d m i s s i o n : ’ ) ) %ha megvan a d i a g n ó z i s ...
20
14. ábra. A nyers EKG-csatornák feldolgozásának lépései. [ tok , temp]= strtok ( lin e , ’ : ’ ) ; %k i s z e d j ü k a s o r v é g é t , ahová l e van í r v a r e a s o n=temp ( 3 : end ) ; %l e m e n t j ü k tempcount=tempcount +1; %e g g y e l t ö b b s z ü k s é g e s a d a t van meg
8
end i f ( f i n d s t r ( line , ’# Acute i n f a r c t i o n ( l o c a l i z a t i o n ) : ’ ) ) %mint az előbb [ tok , temp]= strtok ( lin e , ’ : ’ ) ; a c u t e l o c=temp ( 3 : end ) ; tempcount=tempcount +1; end
10
12
14
16
end (A tempcount változó a kód gyorsítására szolgál: számolja, hogy a két keresett sorból hányat találtunk meg – ha ugyanis már kettőt, akkor felesleges is tovább olvasnunk a fájlt.) Az strtok függvény adott karakternél szétbont egy sztringet; ez esetünkben nagyon praktikus: nincs más dolgunk, mint a :-nál szétvágni a megfelelő sorokat, hiszen így a második részletnek pontosan a 3. karakterénél fog kezdődni az általunk keresett szöveg. Ezt rögtön el is tárolhatjuk a egy-egy változóba: a diagnózist a reason-be, a lokalizációt az acuteloc-ba. 21
15. ábra. Fejlécállomány felépítése Beszéljük most meg a lokalizáció (azaz a neurális hálónk elvárt kimenete) kódolásának kérdéseit! A fejlécállományt feldolgozó függvény egyetlen számot ad vissza, ez lesz a kód, ami leírja a lokalizációt. Természetesen valahogy tájékoztatnunk kell a hívó függvényt arról is, ha netán egyáltalán nem AMI-s beteg adatait dolgozzuk fel. A fentiek figyelembevételével úgy döntöttem, hogy a 0 visszatérési érték fogja jelezni, ha számunkra érdektelen regisztrátumról van szó (nem AMI, vagy AMI, de lokalizáció jelölése nélkül), 1-től kezdődően pedig az egyes lokalizációk szerepelnek. Feldolgozva a teljes adatbázist, azt találtam, hogy 13 különböző lokalizáció fordul elő, így ezeket az 1 . . . 13 számok kódolják. (A 20-as kód szolgál annak jelzésére, hogy olyan lokalizációjú AMI-vel futottunk össze, aminek még nincsen kódja. Ez lehetővé teszi, hogy gyorsan ellenőrizük, hogy minden lokalizációnak osztottunk-e kódot: ha a visszaadott kódok között szerepel a 20, akkor valamiről megfeledkeztünk.) A fejlécállomány feldolgozó függvény kódjának vége tehát:
18
20
22
24
i f ( strcmp ( r e a s o n , ’ M y o c a r d i a l i n f a r c t i o n ’ )&&(~strcmp ( a c u t e l o c , ’ n/ a ’ ) ) &&(~strcmp ( a c u t e l o c , ’ no ’ ) ) ) %s p e c i f i k á l t l o k a l i z á c i ó j ú AMI−k kiválogatása s w i t c h a c u t e l o c %e g y e s l o k a l i z á c i ó k l e k ó d o l á s a c a s e ’ i n f e r o −p o s t e r o −l a t e r a l ’ code =1; c a s e ’ i n f e r o −l a t e r a ’ code =2; c a s e ’ i n f e r o −p o s t e r i o r ’ code =3;
22
case ’ anterior ’ code =4; case ’ i n f e r i o r ’ code =5; c a s e ’ a n t e r o −l a t e r a l ’ code =6; c a s e ’ a n t e r o −s e p t a l ’ code =7; c a s e ’ i n f e r o −l a t e r a l ’ code =8; case ’ posterior ’ code =9; c a s e ’ a n t e r o −s e p t o −l a t e r a l ’ code =10; case ’ l a t e r a l ’ code =11; c a s e ’ p o s t e r o −l a t e r a l ’ code =12; c a s e ’ i n f e r o −p o s t e r −l a t e r a l ’ code =13; otherwise code =20; %nem a f e n t i 13 k a t e g ó r i á b a e s ő l o k a l i z á c i ó , a z a z probléma
26
28
30
32
34
36
38
40
42
44
46
end else
48
code =0; %nem AMI, vagy n i n c s s p e c i f i k á l v a a l o k a l i z á c i ó , a z a z számunkra nem é r d e k e s a d a t end f c l o s e ( f i d ) ; %f á j l l e z á r á s a
50
52
end A referencia kedvéért közlöm a lokalizációkat és kódjaikat táblázatos formában is (1. táblázat). Lokalizáció infero-postero-lateral infero-latera infero-posterior anterior inferior antero-lateral antero-septal infero-lateral posterior antero-septo-lateral lateral postero-lateral infero-poster-lateral
Kód 1 2 3 4 5 6 7 8 9 10 11 12 13
1. táblázat. A kódolt AMI lokalizációi
Nincs más hátra mint a központi függvény megírása, ami az előző kettőt meghívja az összes adatállományra, és az adatokat egyetlen tömbbe gyűjti. A függvénynek először nyilván a fejlécek 23
beolvasását kell elvégeznie, és csak azokat az állományokat detektáltatnia, amik számunkra érdekes adat tartalmaznak (azaz kódjuk nem 0). Ennek céljából elsőként kigyűjtjük az összes dat fájlt, melyeken végigmenve eltároljuk a később feldolgozandóak sorszámát, nevét és kódját: 54
56
58
60
function [ ecgRaw , qrs , l e n , c l a s s i f i c a t i o n , nevek ]= p r o c _ d i r ( BeatLength ) count =1; f i l e s =dir ( ’ ∗ . dat ’ ) ; %a d a t f á j l o k k i g y ű j t é s e j =1; f e l d o l g o z a n d o=zeros ( 1 , length ( f i l e s ) ) ; %a f e l d o l g o z a n d ó a k sorszámának t á r o l á s á r a nevek = [ ] ; %a f e l d o l g o z o t t a d a t á l l o m á n y o k n e v e i n e k v i s s z a a d á s á h o z f e l d o l g o z a n d o N e v = [ ] ; %a f e l d o l g o z a n d ó a k nevének t á r o l á s á r a f e l d o l g o z a n d o C o d e=zeros ( 1 , length ( f i l e s ) ) ; %a f e l d o l g o z a n d ó a k kódjának t á r o l á s á r a f o r i =1: length ( f i l e s ) %minden f á j l t m e g v i z s g á l u n k . . . [ tok ]= strtok ( f i l e s ( i ) . name , ’ . ’ ) ; %k i t e r j e s z t é s t l e v á g j u k code=h e a d p a r s e ( [ tok , ’ . hea ’ ] ) ; % i l l e t v e f e l c s e r é l j ü k , é s í g y beolvastatjuk a fejlécet i f ( code ~=0) %ha számunkra é r d e k e s adat , a k k o r az a d a t a i t eltároljuk f e l d o l g o z a n d o ( j )=i ; f e l d o l g o z a n d o N e v=s t r v c a t ( f e l d o l g o z a n d o N e v , tok ) ; f e l d o l g o z a n d o C o d e ( j )=code ; j=j +1; end end
62
64
66
68
70
72
l e n=zeros ( j −1 ,1) ; %tömbök i n i c i a l i z á l á s a c l a s s i f i c a t i o n =zeros ( j −1 ,1) ;
74
Ezt követően nincs más dolgunk, mint végiglépkedni a feldolgozandó állományokon, mindegyikre lefuttatni a feldolgozórutint, és az eredményeket eltárolni: f o r i =1:( j −1) %i t t már c s a k a számunkra é r d e k e s állományokon megyünk v é g i g . . . f p r i n t f ( ’ Az éppen f e l d o l g o z o t t f á j l neve : %s . \ n ’ , f i l e s ( f e l d o l g o z a n d o ( i ) ) . name ) ; %f e l d o l g o z o t t s á g i a d a t o k k i í r a t á s a f p r i n t f ( ’ Sorszáma : %d , ö s s z e s e n van : %d . \ n ’ , i , ( j −1) ) ; f p r i n t f ( ’ Ez a l a p j á n a f e l d o l g o z o t t s á g : %4.2 f %%.\n ’ , ( i / ( j −1) ) ∗100) ; [ ecgRawTemp , qrsTemp , lenTemp]= p r o c e s s ( f e l d o l g o z a n d o N e v ( i , : ) , BeatLength ) ; %a k t u á l i s állomány f e l d o l g o z á s a i f ~(~any ( ecgRawTemp ( : ) )&&~any ( qrsTemp ( : ) )&&(lenTemp==0)) % döntünk , hogy s i k e r ü l t −e a f e l d o l g o z á s ( ha nem , a k ö v e t k e z ő á l l o m á n y r a ugrunk ) ecgRaw ( count , : , 1 : s i z e ( ecgRawTemp , 2 ) , : )=ecgRawTemp ; %ha v i s z o n t igen , akkor e l t á r o l j u k a nyert adatokat q r s ( count , 1 : 1 2 , 1 : s i z e ( qrsTemp , 2 ) )=qrsTemp ; l e n ( count )=lenTemp ; c l a s s i f i c a t i o n ( count )=f e l d o l g o z a n d o C o d e ( i ) ; nevek=s t r v c a t ( nevek , f e l d o l g o z a n d o N e v ( i , : ) ) ; count=count +1; end end
76
78
80
82
84
86
88
end 24
Vegyük észre, hogy a három visszaadott adat (ecgRaw, qrs, len) mindegyikét egy eggyel nagyobb dimenziójú tömbben tároljuk el: az első dimenzióban jelöljük meg, hogy hányadik állományról van szó. A feldolgozás első részével ezzel végeztünk is! Lefuttva a proc_dir függvényt abban a könyvtárban, ahová letöltöttük az állományokat, megkapjuk azok feldolgozott formáját: minden egyes állományra a benne tárolt regisztrátumon lévő szívütések számát (len), minden egyes állomány mindegy egyes csatornájára a szívütések időpotjait (qrs) és – ami a legfontosabb – mindegy egyes állomány minden egyes csatornájának minden egyes szívciklusát állandó hosszúságúra normálva (ecgRaw). Mindez egy ma középkategóriásnak tekinthető személyi számítógépen némileg több mint három órát vesz igénybe. Ennek végeztével megállapíthatjuk, hogy 159 regisztrátum került feldolgozásra – ennyinél szolgáltatott értékelhető eredményt az R-hullám detekció. Ezen 159 regisztrátumban összesen 22 713 darab szívciklust emeltünk (természetesen mindegyiket 12 párhuzamos csatornán). EKG-k nullába tolása Ennek végeztével egy apróságot érdemes még megtennünk. Mivel a felhasznált EKG regisztrátumok mindegyikében szignifikáns alapjel-vándorlást találunk, az egyes szívciklusok nagyon eltérő amplitúdótartományokba esnek. Ezt megszüntetendő, érdemes mindegyik szívciklusból kivonni a saját átlagát, hogy ilyen módon mindegyiket a nullnívóra toljuk. Ezt valósítja meg a a következő rutin (az e tömbbel egyelőre ne foglalkozzunk): 1
3
5
7
9
function [ ecgNorm , e ]=normEcg ( ecgRaw ) f o r i =1: s i z e ( ecgRaw , 1 ) %állomány sorszáma f o r j =1: s i z e ( ecgRaw , 3 ) %s z í v c i k l u s sorszáma f o r k =1:12 %e l v e z e t é s sorszáma ecgNorm ( i , : , j , k )=ecgRaw ( i , : , j , k )−mean( ecgRaw ( i , : , j , k ) ) ; %n u l l á b a t o l t EKG e ( i , j , k )=sum( ( ecgNorm ( i , : , j , k )−ecgNorm ( i , : , 1 , k ) ) . ^ 2 ) ; %t á v o l s á g az e l s ő s z í v c i k l u s t ó l end end end end
3.3. Kis kitérő – pár gondolat a tanítóállományról Most fel kell tennünk egy látszólag egyszerű kérdést, amely mégis mélyebb megfontolásokat fog szükségessé tenni. Mi legyen a neurális hálónk bemenete? Azaz: a rendelkezésre álló adatokból miket használjunk fel a háló tanítására? Addig világos a helyzet, hogy az egyes elvezetésekből származó szívciklusok adatait kell megadnunk. De vajon mik legyenek ezek a szívciklusok? Első gondolatunk az lehetne, hogy egy regisztrátum alapján csak egyetlen tanítóvektort hozzunk létre. (Ez nyilván felveti azt a nagyon is gyakorlati problémát, hogy így összesen 159 elemű tanítókészletet kapnánk, de ezzel egyelőre ne tördőjünk.) Ez más szóval azt jelenti, hogy a regisztrátum alapján egyetlen, reprezentatív szívciklust kell létrehoznunk minden egyes csatornán. Ez könnyen kivitelezhető indított átlagolással: mivel már úgyis ugyanolyan hosszúra normáltuk az egyes szívciklusokat, nincs más dolgunk mint egyszerűen elvezetésenként kiátlagolni az összes szívciklust és máris megkaptuk az elvezetést reprezentáló (ráadásul jócskán csökkentett zajú) szívciklust. Vegyük észre, hogy ezzel a megközelítéssel van egy kis probléma! Feltételezi, hogy egy regisztrátumon belül az utolsó szívciklus is ugyanaz mint a legelső, legfeljebb a zaj téríti el őket egymástól. (Zaj alatt értve most a szó szerinti fizikai zajt, valamint az EKG természetes élettani ingadozását is.) Precízebb terminológiával élve: feltételezi a jel stacionaritását. Mivel egy AMI akut stádiumában akár percek alatt változhat az EKG, ez szerencsénkre nem áll fenn! Szerencsénkre, hiszen így arra „kényszerülünk”, hogy a hálónknak minden egyes szívciklust külön tanítóvektorként adjunk meg. Ez azt jelenti, hogy a tanítókészletünk nem 159, hanem 22 713 elemű lesz! 25
Mielőtt elhamarkodottan e mellett döntünk, azért vizsgáljuk meg szabatosabban is ezt a kérdést. Képezzük minden regisztrátum minden elvezetésén belül az egyes szívciklusok és a legelső szívciklus pontonként vett különbségét! Az így kapott 40 elemű vektorok értékeit emeljük elemenként négyzetre, majd ezeket a négyzeteket adjuk össze. (Világos, hogy így lényegében a szívciklusok mint vektorok különbségét képeztük.) Ha fennáll azon feltevésünk, hogy a szívciklusok változatlanok, csak a zaj téríti el őket, akkor ezen különbségek sorozata nem szabad, hogy függjön attól, hányadik szívciklusból képeztük a különbséget. Más szóval: ha fennáll a stacionaritási tulajdonság, akkor ezen különbségek sorozata mindenképp autokorrelálatlan. Anélkül, hogy ezt matematikai precizitással vizsgálnám, szemléltetésképp hadd mutassak be két eredményt. Egy adott regisztrátum 5-ös elvezetésében (azaz aVL-ben), a 16. ábrán látható függvényt kaptuk az egyes szívciklusok eltérésnek nagyságára.
16. ábra. Sorozatkorreláció szemléltetése I. Ugyenezen regisztrátum 9-es elvezetésében (azaz V3-ban) viszont a 17. ábrán láthatóakat kapjuk. Az első ábrán látottakról talán elfogadható az autokorrelálatlanság feltevése, de a másodikról semmiképpen sem. Végezetül támasszuk alá ezt precízen is! Az xcorr függvény használatával elkészítettem a két különbségsorozat autokorrelációs vektorait. Ezt közös koordinátarendszerben ábrázolva láthatjuk a 18. ábrán. Az eredmények magukért beszélnek. Foglaljuk össze megállapításainkat! Az EKG jelet általánosságban nem lehet stacionárius folyamatnak tekinteni. Időben előrehaladva az egyes szívciklusok közötti eltérés előfordul, hogy egyre nő, ami annak a jele, hogy maga a jelet keltő (és általunk vizsgált) folyamat változik. Más szóval: egyetlen adott lokalizációt lényegesen eltérő módon jelezhet egy regisztrátum elejéről és végéről vett szívciklus. Ha tehát minden egyes szívciklust felhasználunk tanításra (és nem csak például
26
17. ábra. Sorozatkorreláció szemléltetése II. az átlagukat), akkor sem követünk el elvi hibát, hiszen előfordulhat, hogy a ciklusok nem csak a zajban különböznek egymástól.
3.4. A tanítókészletet megkonstruálása A fentiek alapján felkészülhetünk, hogy megírjuk utolsó szükséges függvényünket, mely az ecgNorm tömbből előállítja a tényleges tanítókészletet. Bemeneti dimenzió redukálása Pillanatnyilag egyetlen tanítóvektor egy szívciklust jelent, 12 elvezetésből felvéve. Az eredeti mintavételezési frekvencia mellett ez 12 · 1000 = 12000 dimenziós bemenőteret jelentene. Ez tökéletesen kezelhetetlen lenne, de szerencsére nem ennyire rossz a helyzet. Először is, a szívciklusok feldolgozásakor már gondoltunk erre a problémára, ezért a mintavételi frekvenciát (az élettani korlátok tiszteletben tartásával) jelentősen lecsökkentettük. Tekintetbe véve, hogy a ciklusokat így mindössze 40 pontra mintavételeztük, ez összesen máris csak 12 · 40 = 480 dimenziós bemenőteret jelent. De további megfontolásokkal még ez is csökkenthető! Vegyük észre, hogy – bár a standard 12 elvezetéses rendszernek része – az Einthoven III elvezetés egyszerűen az I és II lineáris kombinációja, vagyis többletinformációt nem hordoz. Ez elhagyható. Sőt! Az aVR, aVL, aVL elvezetésekkel is hasonló a helyzet, hiszen ezek az I, II, III elvezetések lineáris kombinációjaként előállíthatóak (ténylegesen ez is történik az EKG-ban, igaz, villamos úton), azaz nem lineárisan függetlenek, így szintén elhagyhatóak. Ezen 4 csatorna elhagyásával a bemenet dimenziószáma 8·40 = 320-ra esett, amely több nagyságrendnyi javulás a kezdeti 12 000-hez képest.
27
18. ábra. Az előző sorok autokorrelációi Mesterséges minták konstruálása Vegyük észre, hogy az eddig használt öszes EKG-adatunk szinte teljesen zajmentes volt (az igen jó, klinikai gyakorlatot messze meghaladó minőségű felvételek miatt). Így okkal adódik a gondolat, hogy egyetlen mintából zaj hozzákeverésével többet generáljunk. Ez bevett módszer a neurális hálók mintáinak előkészítésekor, hiszen (ha valóban független, de a feladat szempontjából plauzibilis mintákat tudunk létrehozni!) így többszörösére növelhető a tanítókészlet mérete. Esetünkben ezek a feltételek maximálisan megvalósulnak. Zaj hozzákeverésével nem csak, hogy elvileg elképzelhető mintákat tudunk létrehozni, de egyenesen az várható, hogy a gyakorlati EKG-k ilyen, zajos felvételek lesznek – szemben a mi állományainkkal. Lehetőségeinket tovább növeli, hogy az EKG-kat terhelő zajforrásokat a szakirodalom már alaposan megtárgyalta. Ismerjük a lehetséges zajforrásokat (hálózati interferencia, EMG-interferencia stb.), melyek jellemzői (időbeli lefutás, spektrum, stb.) szintén jól leírtak. Ez lehetővé teszi különféle zajmodellek elkészítését. Végeredményben generálhatunk zajosított mintákat minden megvalósított zajmodell szerint, valamint azok tetszőleges kombinációjával is. Ilyen módon a tanítókészlet mérete nagyságrendekkel növelhető! A tanítókészlet létrehozása Végül készítsük el a tényleges tanítókészletünket! (Mivel a több mint 20 000 minta így is bőven elégnek ígérkezik, a zaj rákeverésével történő mesterséges mintaszaporítástól most eltekintettünk.) Ahogy láttuk, egyetlen szívütés 8 elvezetésből párhuzamosan felvett (és 40 pontra normált) regisztrátumait fogjuk egymás után fűzni, hogy így megkapjuk a 320 elem hosszú tanítóvektort. 28
2
4
6
8
10
12
14
function [ ecg , d e s i r e d ]= c o n s t r u c t ( ecgNorm , c l a s s , BeatLength , l e n ) count =1; e c g=zeros (sum( l e n ) , 3 2 0 ) ; d e s i r e d=zeros (sum( l e n ) , 1 3 ) ; f o r i =1: s i z e ( ecgNorm , 1 ) %állomány sorszáma f o r j =1: l e n ( i )−1 %s z í v c i k l u s sorszáma e c g ( count , 1 : ( 2 ∗ BeatLength ) ) =[ecgNorm ( i , : , j , 1 ) , ecgNorm ( i , : , j , 2 ) ] ; %I , I I −e s e l v e z e t é s f o r k =7:12 e c g ( count , ( ( ( k−5)∗ BeatLength ) +1) : ( ( k−4)∗ BeatLength ) )= ecgNorm ( i , : , j , k ) ; %t ö b b i e l v e z e t é s h o z z á f ű z é s e end d e s i r e d ( count , c l a s s ( i ) ) =1; count=count +1; end end end Igen látványos képet kapunk, ha az összes tanítóvektorunkat egyetlen koordinátarendszeren belül ábrátozoljuk (19. ábra).
19. ábra. Az összes megkapott tanítóvektor egyetlen koordinátarendszerben ábrázolva Látható, hogy az ecg tömb soraiba kerülnek az egyes tanítóvektorok. A desired tartalmazza a hozzájuk tartozó elvárt kimeneteket. Erre a célra ugyan választhattuk volna közvetlenül az osztályozás során kapott kódot (ilyen módon egyetlen kimenetet létrehozva, mely a [1 13] tartományból vesz fel egész értékeket). Ennél azonban jóval zajtűrőbb, ha minden egyes osztályhoz egy külön kimenetet rendelünk, vagyis hálónk 13 kimenetű lesz. 29
Ehhez nincs más dolgunk, mint az osztályzási értéket „1-ből M-et” kódolás szerint átalakítani. Ennek lényege, hogy egy adott i értékből egy 13 elemű vektort képezünk, melynek minden eleme 0, kivéve az i-ediket, ami 1.
4. Neurális háló konstrukciója és tanítása Matlab környezet alatt A neurális háló tényleges implementálásához először is architektúrát kell választanunk. Mi a továbbiakban a többrétegű perceptron (MLP) architektúrát fogjuk használni, hiszen a gyakorlati neurális hálók nagy többsége is ezt alkalmazza, és a legtöbb alternatív hálóarchitektúrával egyébként is kompatibilitás mutatkozik. A feladatnak nincs olyen speciális tulajdonsága, mely egyéb konkrét architektúra választását tenné szükségessé. Az architektúráról való határozás után szükséges, hogy döntsük a rétegek számáról, illetve meghatározzuk, hogy hány neuron legyen az egyes rétegeken belül. Mindkét kérdés könyvtárnyi szakirodalommal rendelkezik, de ennek ellenére mindmáig a korábbi tapasztalatok felhasználása, illetve a szisztematikus kísérletezés a vezető módszer e feladat megoldásában. Választásom az egyrétegű hálóra esett, mert – mint látni fogjuk – ez is kielégítő eredményeket szolgáltat, ezért nem láttam értelmét további bonyolításnak. Több réteg használata akkor szokott még indokolt lenni, ha egy rétegben rendkívül nagy számú neuron alkalmazására lenne szükség, de itt ez sem áll fenn. Az már sokkal fogósabb kérdés, hogy az egyetlen rétegünkbe hány neuron kerüljön. Itt én is az iteratív próbálgatás módszeréhez folyamodtam: több különböző darabszámmal is tanítottam hálókat, és figyeltem a hiba alakulását. Végeredményben arra az eredményre jutottam, hogy 40 neuron adja a legjobb eredményeket. Ennek figyelembevételével a következő a választott háló teljes architektúrája (20. ábra).
20. ábra. A megoldáshoz választott MLP architektúrájának sémája A tanítását a Matlab Neural Network Toolbox-ával könnyen el lehet végezni. Én is ezt tettem, az előkészített adatokkal elindítottam a háló tanítását. Ez (nyilván az adatok hatalmas mérete miatt) 15 percet vett igénybe. De megérte a várakozás, az eredményül kapott háló igen jól rátanult az adatokra. A következő grafikon (21. ábra) mutatja a háló tanulását 100 epochon keresztül. (Látható, hogy ekkorra a tanulás sebessége már jócskán lelassult, ám a túltanulás még nem indult el, hiszen a teszt-készlet görbéje nem távolodott el érzékelhetően.) (A túlilleszkedés elkerülése végett korai leállítást alkalmaztam. A teljes tanítókészlet 15%-át dedikáltam tesztelésre, 15%-át validációra.)
30
21. ábra. Az MLP tanítása
5. Eredmények értékelése, továbbfejlesztési lehetőségek, záró gondolatok A fenti eredmények (pusztán a minőséget jellemző paramétereket tekintve) mindenképpen jónak mondhatóak. Az igazán megbízható értékelést, a valódi viszonyítási alapot azonban az jelentené, ha ugyanezeket a regisztrátumokat orvosokkal is felismertetnénk, és az ő teljesítményükkel vetnénk össze a neurális hálóét – ilyen vizsgálatot sajnos nem állt módomban elvégezni. (Mindazonáltal bizakodó vagyok: véleményem szerint a háló, kicsit filozofikusabban: a mesterséges intelligencia megoldásai orvosokkal szemben is fölvennék a versenyt egy ilyen feladat megoldásánál.) A továbbfejlesztés legfontosabb lehetséges iránya teljesen egyértelmű: még több minta felhasználása. A nagyobb tanítókészlet mindenképp jót tesz a neurális háló teljesítményének, ráadásul kellő számú mintánál áttérhetünk a szívciklusonkénti értékelésről a szívciklus-párok, -hármasok stb. átlagával való tanításra. (Hogy minimalizáljuk a tanítóvektorokban lévő, nem kézbentartott redundanciát.) Szintén a mintaszámot emelheti a már részletezett mesterséges mintagenerálás. Ennek eredményessége tovább nő, ha realisztikus zajmodelleket, illetve ilyenek kombinációit alkalmazzuk. (Ehhez természetesen már erős gép, illetve sok türelem kell. . . ) Érdemes lehet megvizsgálni más neurális hálóarchitektúrák alkalmazhatóságát. Jelen dolgozaton belül egyáltalán nem foglalkoztunk az architektúraválasztás, és nem nagyon foglalkoztunk az architektúra-paraméterezés hatásával, pedig ezek is tartogathatnak érdekességeket. Végül megemlítem, hogy ez a koncepció elvileg kiterjeszthető a lokalizáció szerinti osztályozáson túli feladatokra is. Kézenfekvő továbblépési lehetőség magának az AMI-nek a felismertetése (ne feledjük, most csak igazoltan AMI-s EKG-kal tréningeztük a hálózatot), esetleg a különböző további rendellenességek osztályozásának bevezetése. Ez természetesen már szignifikánsan nagyobb kiindulási adatbázist igényel. Ezen utolsó megjegyzés elvezet minket az ilyen jellegű megoldások gyakorlati alkalmazásának terére. A mai szemlélet azt diktálja, hogy a műszaki megoldásaink (jelen esetben a mesterséges intelligencia eredményei) ne az orvosok helyett próbáljanak meg diagnosztizálni, hanem az orvosokkal együttműködve, őket támogatva. Ilyen szerepkörben helye van az EKG diagnosztizálását támogató műszaki megoldásoknak! És valóban: a legtöbb mai EKG-nál alapelvárás, hogy a a rutin paraméterek automatikus meghatározásán túl diagnosztikai támpontokat is nyújtson (automatikusan!) a kezelő orvosnak. Jelen dolgozatom bátran tekinthető e feladat megoldására tett legelső, kezdeti lépések szemléltetésének.
31
Mindez pedig szép példáját adja az orvosok és a mérnökök közötti, egymás gondolkodásmódját tiszteletbentartó, de mégis a saját terület eredményei alapján konstruktívan kritizáló, és így kölcsönösen gyümölcsöző együttműködésnek.
32
Hivatkozások [1] Arthur C. Guyton, John E. Hall, The Textbook of Medical Physiology, Elsevier Saunders, 2006 [2] Tarsoly Emil, Funkcionális anatómia, Medicina Könyvkiadó, 1999 [3] Szentágothai János, Réthelyi Miklós, Funkcionális anatómia, Medicina Könyvkiadó, 2006 [4] Kiss Ferenc, Szentágothai János, Az ember anatómiájának atlasza, Medicina Könyvkiadó, 1974 [5] Gőbl Gábor (ed.), Oxiológia, Medicina Könyvkiadó, 2001 [6] Pénzes István (ed.), Az újraélesztés tankönyve, Medicina Könyvkiadó, 2000 [7] Horváth Gábor (ed.), Neurális hálózatok és műszaki alkalmazásaik, Műegyetemi Kiadó, 1998 [8] Horváth Gábor (ed.), Neurális hálózatok, Panem, 2006 [9] Monostory Iván, Valószínűségelmélet és matematikai statisztika, Műegyetemi Kiadó, 2004 [10] Jobbágy Ákos, Orvosbiológiai méréstechnika, BME-MIT, 2003
33
Tartalomjegyzék 1. Orvosi alapok 1.1. Elektrofiziológiai alapismeretek 1.2. A szív és elektromos aktivitása 1.3. A gyakorlati elektrokardiográfia 1.4. Az infarctusról . . . . . . . . .
. . . . . . . . . . alapjai . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 1 4 6 8
2. A feladat megfogalmazása, a neurális hálókkal történő megoldás megfontolásai 11 3. Adatok előfeldolgozása 3.1. Nyers adatok beszerzése . . . . . . . . . . . . . . . 3.2. Nyers adatok Matlab környezet alá importálása... 3.3. Kis kitérő – pár gondolat a tanítóállományról . . . 3.4. A tanítókészletet megkonstruálása . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
12 12 13 25 27
4. Neurális háló konstrukciója és tanítása...
30
5. Eredmények értékelése, továbbfejlesztési lehetőségek, záró gondolatok
31
34