Levenberg-Marquardt algoritmussal függvényt kéne illesztenem adatpontokra. A Gnuplot fit parancsa pont ezt csinálja, csak nekem A FIT_LIMIT paramétert 10^-500-ra kéne állítani, Viszont csak 10^-309-ig lehet. (10^-320 körül még elfogadja, de akkor már elkerekíti.) Nem tudja valaki, megoldható-e valahogy a 10^-500-as érték? Egyáltalán mekkora tartományban számol a gnuplot (a leírásban nem találtam erre utalást, de lehet, hogy csak én voltam vaksi)? Esetleg tud valaki olyan ingyenes programot Linuxra, ami képes erre? Fizetőset (aranyárban) és ráadásul win-re én is tudok, az t nem kell írni (Sigmaplot).
- 1682 megtekintés
Hozzászólások
Bocs, de áruld már el (baromira érdekelne), hogy mihez kell a 10^-500 pontosság!
----------
Were antimatter present, its detection would be quite simple and straightforward. The most rudimentary detector suffices: simply place it down and wait. If the detector disappears, antimatter has been discovered - get out fast!
- A hozzászóláshoz be kell jelentkezni
Nem pontosan fogalmaztam. A FIT_LIMIT nem egészen pontosság, hanem hogy az illeszkedés jóságát leíró chi-square (khi-négyzet) statisztika milyen méretű változására álljon le az iteráció (amíg ezt meghaladja a javulás, csinálja). A feleségem kormeghatározással foglalkozik, és a standard beállításokkal ellátott célprogram nem adott eredményt neki, így megpróbáltuk kézzel illeszteni, Egy cikkben írták a 10^-500 FIT_LIMITET (bár ott másnak hívták, mert ők Sigmaplot-ot használtak). Én is megdöbbentem rajta, de mint kiderült, amikor egy, a cikkben elvégzett illesztést próbáltam reprodukálni a gnuplot-tal, baromi nagy jelentősége van a kérdésées 8 paraméteres, 4 exponenciális függvény összegéből adódó függvény illesztésénél. Egyébként szinte biztos voltam benne, hogy (mint ahogy én is) mindenki elképed a nagyságrenden.
- A hozzászóláshoz be kell jelentkezni
a cikkben elvégzett illesztést próbáltam reprodukálni a gnuplot-tal
a gnuplot neha tud furcsa dolgokat produkalni. a legnagyobb hibaja az, hogy a linearis illlesztest is a nemlin. modszerre (levenberg-marquadt) vezeti vissza, holott azt egzaktul ki lehetne szamolni. az lm modszernel pedig szinten kepes elszallni, ha az ember nem figyel oda... meglepodtem en is, sokszor...
A.
- A hozzászóláshoz be kell jelentkezni
Hát, első tippre az a 10^-309 az valamilyen lebegőpontos számtípusban (talán double) a legkisebb kezelhető mennyiség. Egy (talán) lehetséges megoldás a gnuplotot megpacsálni (patch-elni), hogy minden double helyett long double-t használjon.
Vagy egy direkt fittelőprogramot letölteni, pl. a netlib.org-ról. A Numerical Recipes-ben is biztos van valami, nem hinném, hogy nehéz módosítani valami más számtípushoz (esetleg egy tetszőleges pontosságú lib-hez, valami ügyes wrapper-classal, talán van is valami a függelékben).
Egyébként ez a pontosság-igény elég meghökkentően hangzik. Mihez kell (ha nem hadititok :-) )?
- A hozzászóláshoz be kell jelentkezni
Köszi. A Numerical Recipes-ben ott a Levenberg-Marquardt algoritmus, csak most még nincs időm vele foglalkozni. Rég programoztam már, fel kell eleveníteni a dolgokat.
A pontosság-igényhez lásd az első post-ra adott választ.
- A hozzászóláshoz be kell jelentkezni
Nem kell programozni, ott van a kód.
- A hozzászóláshoz be kell jelentkezni
A kód az ott van, de csak az algoritmus maga. Input-output kezelés, stb még hozzáírandó azért. Persze az a kisebb meló.
- A hozzászóláshoz be kell jelentkezni
A "Numerical Recipes Example Book"-ban van példaprogram: generál két Gauss-görbe összege+zaj. A CD-n (Numercial Recipes in C++) rajta van a fittelő és a példaprogram is.
Persze az I/O-t még így is meg kell írni.
- A hozzászóláshoz be kell jelentkezni
hat hogy "ott van" az igy tulzas. num rec in C, es a tomboket [1]-tol sza'mozza. ez a baj a numrec-cel, hogy baromijo konyv, meg referencia meg minden, de hogy abbol te a gyakorlatban kopipeszt szinten barmit is hasznalni tudsz, az, ha't, nem...:/
- A hozzászóláshoz be kell jelentkezni
A tömböket tényleg [1]-től számozza a C-verzió (bár, azért vannak egész jól használható vektor- és mátrixlefoglaló rutinjaik), de ennek ellenére használható, ha a) tudomásulveszed, hogy amit NR-hez írsz, mással nem fog együttműködni
b)nem okoz gondot neked ugrálni a kétféle konvenció között.
De egyébként is mindenkit rábeszélnék inkább a C++-változat használatára: sokkal kevesebb lehetőség van elszúrni a programot a mátrix, vektor, stb. objektumoknak köszönhetően (a mátrix meg tudja mondani a méreteit).
Ráadásul a C++-változatban [0]-tól számoznak.
- A hozzászóláshoz be kell jelentkezni
Valoszinuleg sima double-okkal szamol a gnuplot, innen a 10^{-309}.
Esetleg tud valaki olyan ingyenes programot Linuxra, ami képes erre?
van egy sajat fejlesztesu" biszbasz, lasd itt. Alapesetben ez is sima'n double-okkal szamol, de (szerintem) megpeccselheto" egyszeru"en hogy double helyett long double-lal szamoljon. Azzal ma'r 10^{-6000} koruli ertekek is elerheto"ek (a sizeof(long double)=96 bit az a'tvere's asszem az csak 80bit, de a 80 nem oszthato 32-vel, ezert kiterjesztik 96-ra). x86_64-en pedig asszem ma'r valodi 128bites.
szoval ha meg tudod peccselni a progit, akkor hajra, ha nem, es ra'e'r 1-2 napig, akkor megcsinalhatom (ugy mint forditasi opcio + kezzel makefile beletu'r, ./configure egyelo"re luxus). egyebkent tenyleg frucsa, vagyis nem ertem hogy pontosan mit szeretnel 10^{-500}-as pontossaggal "jellemezni". Az soha nem fog menni, hogy a fittelt parameterek relativ hibaja 10^{-15}-ne'l (long double: 10^{-19} vagy 10^{-30}) jobb legyen.
A.
- A hozzászóláshoz be kell jelentkezni
Aha én is írtam egy kics rutint, arra hogy 128-bites számot szétkava 2-részre (2 long double) ben tároljon 1 számot, a b..b.. pont jó erre az enyém is hasonló de mi a csudának kel ekkora pontosság a gnuplotban? csináld meg c-vel a számolást én a gnuplotot csk rajzra használom.
- A hozzászóláshoz be kell jelentkezni
Vagy aka'r bc-ben is meg lehetne irni. Ha egyszeru" linearis az illeszte's, keves valtozoval (ismeretlennel), akkor par sor (a bc nyelve nagyon hasonlit a c-hez). Es ha valami, akkor a bc az azta'n olyan pontos, amilyen pontossa'got nem sze'gyellunk ;]
- A hozzászóláshoz be kell jelentkezni
Hm erről még nem is hallottam, pedig linuxolok meg c-vel foglalatoskodok már jó ideje. ez orvoslást kíván :D
- A hozzászóláshoz be kell jelentkezni
Sajnos nem egyszerű, nem is lineáris, még paramétereiben sem lineáris az illesztés (azaz nem lehet trükkösen lineáris esetre visszavezetni). Lineáris esetben akár papíron is meg tudom csinálni, nagyobb számoknál meg bármilyen programmal, ami meg tud oldani lin. egyenletrendszert. Elvileg vmi statisztikus féle lennék.
- A hozzászóláshoz be kell jelentkezni
Ill használtam most gle-zek bár nem pont ugyanarra valók de érdekelt, meg akartam tanulni.
- A hozzászóláshoz be kell jelentkezni
Köszi a választ!
"egyebkent tenyleg frucsa, vagyis nem ertem hogy pontosan mit szeretnel 10^{-500}-as pontossaggal "jellemezni". Az soha nem fog menni, hogy a fittelt parameterek relativ hibaja 10^{-15}-ne'l (long double: 10^{-19} vagy 10^{-30}) jobb legyen."
Az első post-ra adott válaszomban írtam, hogy mire mondtam a pontosságot (maradnom kellett volna a FIT_LIMIT kizárólagos használatánál). A paraméterek relatív hibája konkrét esetben egész nagy is lehet.
Megkérdezhetem, hogy a "saját fejlesztésű biszbasz" a nemlineáris illesztést milyen módszerrel/algoritmussal végzi? Nekem speciel korábbi eredmények reprodukálása miatt muszáj a Levenberg-Marquard algoritmus. Bár az meg ott van végül is a Numerical Recipes-ben, majd heggesztek egy kicsit.
- A hozzászóláshoz be kell jelentkezni
nemlineáris illesztést milyen módszerrel/algoritmussal végzi?
ez is L-M-et hasznal, de elvileg az osszes parametere (\lambda, \lambda_m, iteraciok szama e's a kezdeti ertekek) beallithato kezzel. so"t, a kezdeti ertekeket be is kell allitani... kulonben nagyon el tud sza'llni.
A.
- A hozzászóláshoz be kell jelentkezni
http://www.ics.forth.gr/~lourakis/levmar/
gnu scientific library (Minimization Algorithms using Derivatives)
a LAPACK FORTRANt hasznal, de van c interface-e (sot c++ interface-e) is
http://www.idiom.com/~zilla/Computer/Javanumeric/index.html
.
.
.
http://octave.sourceforge.net/doc/f/leasqr.html
k.
- A hozzászóláshoz be kell jelentkezni
Az Octave tudtommal csak double-t használ.
- A hozzászóláshoz be kell jelentkezni
ajánlom még esetleg a BFGS-t
néha bizony jobban muzsikál, mint a L-M
de én is valami kapitális félreértést érzek itt 10^-500 az nagyon túllövés a célon
olyat még soha nem láttam, ahol a chsq relatív változására 10^-10 -nél kisebb aránynak lett volna értelme
- A hozzászóláshoz be kell jelentkezni
Az itt található cikkben a 12 oldal alsó felén szerepel a kérdéses érték. Nincs okom kételkedni a szerzők hozzáértésében, kb. 30 éve aktív művelői a területnek, egyikük az elméleti alapok egyik kidolgozója (nem a függvényillesztésé, hanem az optikai kormeghatározásé). Kicsit előtte ott a kérdéses függvényalak is. Egyébként amennyire a gnuplot-os eredmények alapján következtetni tudok rá, nem túllövés a 10^-500, csak baromi lassan konvergál a L-M algoritmus jelen esetben. 10^-5 esetében borzalmasan mellényúl, és ez még 10^-300 körül is csak elkezd javulni.
- A hozzászóláshoz be kell jelentkezni
akkor más módszert javaslok pl BFGS
juteszembe! ugye analitikus deriváltakkal dolgozol??? semmiképp se próbálj meg numerikusan közelítettekkel!
+még
http://plato.asu.edu/sub/nonlsq.html
+szerk:
belepislantottam a cikkbe. Én is hasonló dolgokkal foglalkoztam, de nem ennyire alulhatározottakkal. Nem tudom, hogy ennek a feladatnak ilyen lapos chsq függvény mellet van-e egyáltalán értelme - vagy lehet, hogy kimerítő kereséssel jobban jársz, mint általános nonlin illesztővel.
- A hozzászóláshoz be kell jelentkezni
No, nekem az egészhez csak annyi közöm van, hogy a feleségem kutatóként optikai kormeghatározással foglalkozik, és a standard software, amit használnak, sok mintájára nem adott eredményt. Elkezdett utánajárni a dolognak és akkor találta ezt a cikket. Én meg úgy jövök a képbe, hogy van némi közöm a statisztikához, ez meg végül is egy nemlineáris regresszió. Sigmaplot (amire a cikk hivatkozik) itthon nincs, és nem is lesz (a munkahelyén, mint közben kiderül van, sőt még upgrade-elik is frissre mert másnak is kell, mint kiderült), úgyhogy szétnéztem mi tudja a cikkben emlegetett módon a nemlineáris legkisebb négyzetek módszerét. Jé, a gnuplot pont így dolgozik. Nosza, probléma megoldva. Aztán mégsem.
Kérdésedre, hogy analitikus deriváltakkal dolgozom-e, az a válaszom, hogy nem tudom, amennyiben a gnuplot igen, akkor igen, ellenkező esetben nem. De egyenlőre ennyire ástam bele magam a területbe, s bár érdekel, de azért közben a saját melómmal is kell foglalkoznom. Már így is sokat segítettetek, van honnan elindulnom.
Az L-M algoritmus meg csak azért kéne (legalább is kezdetben), mert szeretném kontrollálni, pontosan a cikben bemutatott eredményekre jutok-e, tudom-e azokat reprodukálni. Így is a falra mászok, hogy sok kutató a számítási módszerek leírásánál olyan cikkekre hivatkozik, amik szontén csak másik cikkekre hivatkoznak, és konkrétan ebben a cikkben láttam először leírva, mivel számolnak. Pedig a feleségemnek a diplomamunkája megírása óta rágom a fülét, hogy járjon utána, mert érdekel. Mostanra futott bele (pedig eltelt közben pár év).
- A hozzászóláshoz be kell jelentkezni
ahh most néztem meg, mi is pontosan a gnuplot tool, amivel dolgozol
hát izé
asszem ez kevés lesz hozzá
- én előkapnám a Numerical Recipes mrqmin LM minimalizáló algoritmusát
- kiszedném a deriváltakat pl Matematikából vagy Derive-ból
- összeütnék egy kis móricka programot ami képes beadott adatfájlt illeszteni
- aztán sokat, sokat tesztelgetném, haladnék a triviálistól a bonyolultabb görbe illesztési problémák felé
így együtt kitapasztalnám a viselkedését az eszköznek és a problémának, és előbb vagy utóbb szépen szakértő lennék a témában
programozási gyakorlattal 1-2 hónap
anélkül 1 év
- A hozzászóláshoz be kell jelentkezni
Nagyjából ez a terv, amit vázoltál, kiegészítve azzal, hogy a deriváltak azért nem túl rondák (ebben a konkrét esetben), papíron is megy akár, vagy mondjuk akkor már legyen maxima, az van Linux-on is. A móricka programnál meg is áll a dolog egyenlőre, mert a feleségemnek kifejezetten ilyen alakú görbék kellenek. Esetleg saját érdeklődésre bővítgetem majd, de szvsz majd úgy, hogy a deriváltakat kézzel kell megadni paraméterként a függvénnyel együtt. Az hogy a gnuplot kevés, az már sejthető volt a kérdés felvetésekor is, inkább az okokra, meg tanácsokra voltam kiváncsi.
- A hozzászóláshoz be kell jelentkezni
Hali,
ezekhez a statisztikai dolgokhoz nem értek, de van egy gretl (http://gretl.sourceforge.net) nevü program, ami az általad említett algoritmust is kezeli.
sajnos nics vele különösebb tapasztalatom, gőzöm sincs, hogy milyen pontos, jó-e Neked egyáltalán (biztosan jobban értesz nálam a témához). Esetleg egy pillantást megér.
- A hozzászóláshoz be kell jelentkezni
A gretl alapvetően ökonometriai számításokra van, olyannyira, hogy a Ramanathan: Introduction Econometrics könyvhöz CD-n mellékelik (korábbi kiadásoknál zárt forrású programot kellett venni a példaszámításokhoz, úgyhogy nagy piros pont a szerzőnek). Elvileg erre is jó lenne, azonban gyakorlatilag nem. Kevésbé idétlen alakú függvényekre van az felkészülve. Főleg ilyen feltételekkel, mint 10^-500 FIT_LIMIT. De köszi.
- A hozzászóláshoz be kell jelentkezni