HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

  • sdani: Sajnos nekem is hasonló érzéseim vannak az R kiszorulásával kapcsolatban. Remélem jobban fogja tar... (2024.04.29. 10:48) R meetup
  • sdani: Nagyon jók ezek a bejegyzések! Feszültséggel teli, fordulatos, mint egy jobb krimi. :D Abba ne hag... (2024.04.29. 10:35) Wgel CTF
  • sdani: @Travis.CG: Egy kis szerencse sosem árt. :D (2024.03.01. 13:19) A bioinformatika helyzete 2024-ben
  • Travis.CG: Szóval az akadémiai szféra mazochistává tett, amit a Pinephone-al élek ki? Hmm, érdekes összefüggé... (2023.10.05. 18:23) Új barátom az Informatikai titkárságról
  • Travis.CG: Túl nagy a hype körülötte, ezért túlzó elvárások vannak vele szembe. Ha a korábbi chatbotokhoz kép... (2023.02.28. 06:28) chatGPT, a bioinformatikus

A számítógép számításai

2020.11.29. 22:53 Travis.CG

Amikor a számítógépeket használjuk, hajlamosak vagyunk (na, jó, hajlamos vagyok) azt hinni, hogy a kiszámított értékek teljességgel pontosak. A valóság viszont az, hogy csak egy közelítést adnak. Alkalmanként nem is olyan közelit.

Már eddig láttam jeleket, hogy a számítógépek máshogy viszonyulnak a számokhoz. Ha megnéz az ember egy 256b Mandelbrot fraktál zoomert, akkor előbb-utóbb azt tapasztalja, hogy a lebegőpontos számításhoz használt értékek elérik végső határukat, nevezetesen a fraktál egy színű lesz. De nem kell egy demoscene rendezvényre elmenni, hogy mindezt lássuk. A Python híresen rosszul kezeli a lebegőpontos számokat. Próbáljuk csak ki az interaktív konzolba beírva:

>>> 6.89 + 0.1
6.989999999999999

Az egyik legutóbbi feladatomnál Fisher tesztet kellett végeznem, viszonylag nagy számokra. A kontingencia táblázatban alkalmanként 200 milliós érték is lehetett! Az elvégzendő tesztek száma pedig olyan nagy volt, hogy nem akartam R-el vesződni. Igen, kicsit sok adat gyűlt össze. A teszt végeredményének kiszámításához faktoriálisokat kellett használni, és itt kezdődtek a problémák.

Ha csak a naív módszert használjuk, hamar rájövünk, hogy a 64 bites lebegőpontos számokkal 142-nél nagyobb faktoriálist nem lehet kiszámítani. Ráadásul a Fisher tesztben nem egy faktoriális szerepel, hanem faktoriálisok szorzata! Ezért a régi, jól bevált módszerhez folyamodtam: Nem szoroztam, hanem az értékek logaritmusát adtam össze. Mindjárt elég volt a hely, hogy akár 200 milliónak is kiszámítsam a faktoriálisát.

Ezzel viszont a pontosság rovására mentem. Ha megnéztem, milyen eredményt ad ki az R, akkor a nagyságrend stimmelt, viszont az értékek köszönő viszonyban sem voltak. A sebesség is gyatra volt. Egy teszt kiszámítása  kb. 4 másodpercet vett igénybe. Az összes teszthez két hónapra lett volna szükségem!

Lassú és rossz. Ezt a kombinációt akartam elkerülni. De mit lehet tenni ilyen esetben? Tisztázni kell a célokat. Igazából nem muszály manuálisan kiszámítani a faktoriálisokat, van egy közelítő eljárás, a Strigling módszer. Nem ad pontos eredményt, de nagyon gyorsan adja vissza. Egy gyors összehasonlítás a korrekten kiszámított értékekkel azt mutatja, hogy már alacsony értékeknél is lehet eltérés.

n Stirling korrekt
1 0,922 1
2 1,919 2
3 5,836 6
4 23,506 24
5 118,019 120
6 710,078 720
7 4980,396 5040
8 39902,395 40320
9 359536.873 362880

Egy közelítő értékeket használó statisztikai teszt, ami gyors és rossz. Lehet ebből jó eredmény? A válasz az, hogy igen. Ugyanis nekem azt kell eldönteni, hogy az asszociáció létezik-e két jelenség között. Tulajdonképpen nem számít, hogy ez az érték 3,4e-14, vagy 5,6e-12, amíg ebben a nagyságrendben mozognak. Ezt viszont a közelítő értékekkel is meg tudom állapítani.

Azért annyit változtattam a faktoriális kiszámító eljárásomon, hogy ha 10-nél kisebb számot adok meg neki, azonnal visszaad egy előre tárolt értéket. Ha 10 és 120 közötti az érték, akkor pontosan kiszámítja (ha eltekintünk a kerekítési hibáktól), és csak ennél magasabb érték esetén használja a közelítő formulát.

A program olyan gyors lett, hogy a másodperc tört része alatt megkaptam az összes eredményt. (Utána jutott eszembe, hogy elég lenne a legnagyobb szükséges értékre kiszámítani a faktoriálist és az összes köztes értéket tárolni egy tömbben, az gyors is lenne és pontos is.)

Ettől függetlenül látható, hogy a számítás módja meghatározza az eredményeket. Ez nem csak nálam érhető tetten, a nagy cégek által írt programoknál is fontos. Ha megfeledkezünk az Excelről, akkor is marad elég példa. Sőt, ahogy változik egy API verziószáma, úgy áttérhetnek más számítási módszerre is. Érdemes résen lenni, és sűrűn olvasni a dokumentációt.

Azért elgondolkodtató, hogy mennyire ismerhetjük meg a valóságot. Hiszen nem csak a számítás torzításán keresztül látjuk a világot, hanem azt is el kell dönteni, milyen torzítást használjunk. De biztosan tudom a kiválasztott módszer összes hátrányát? Nem lehet, hogy további meglepetések várnak rám, csak a megértésem még nem jutott el arra a szintre?

Az én példámnál maradvan, nem a Stirling az egyetlen közelítő eljárás. Választhattam volna mást is, amely más tulajdonságokkal bír. Ez még csak a faktoriálist. Erre épül a Fisher tesztem, ami ha egyszerűsítést nem is, kerekítési hibákat tartalmazhat.

Mi a jobb? Megállni biztos távolságra az ismeretlentől, és kijelenteni: eddig a pontig mindent ellenőriztem, amit itt találtam, az megbízható. Esetleg a hiányosságok ellenére is tovább menni, és remélni, hogy amit látok, az egy új eredmény, nem pedig a szemüvegem torzításának a felnagyítása?

Szólj hozzá!

Címkék: filozofálás

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr2916297320

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása