Levenberg-Marquardt müködése és implementációja probléma

Keresés
Hírlevél
 
ASPC#C++CSSDelphiFlashJavaJavaScriptPascalPerlPHPPythonuniPaaSVisual BasicVisual C++  »    
nyitotta: taz1988, idő: 2009.10.28., moderátor: moderator, megoldás elfogadva: 2009.10.28. 19:13
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben

Kategóriák:Egyéb » Matematika
Programozási nyelvek » Java

Sorrend:
Időzóna:
Blokkméret:
Oszd meg!
Sziasztok!
Levenberg-Marquardt algoritmust kell használnom egy alkalmazáshoz. Eddig még sohasem használtam, csak annyit tudok róla hogy megkeresi fügvények minimum helyét ( ha jól értem ). Kérem, hogy akinek van már matematikai tapasztalata, hogy ez az algoritmus hogy mükődik, írja le nekem. A másik probléma hogy egy Java implementáció kell, olyan aminél nem kéne definiálni a fügvény parciális deriváltját is. Találkozot valaki már ilyen implementációval? Az se baj ha nem java nyelv, ha könnyen átvihető java nyelvre!
Előre is köszönöm a válaszokat!
Tehát: én nem hinném, hogy találsz olyan libet ingyér Java-hoz, ami kiszámolja a deriváltat.

Helyette én ezt javaslom: Online Derivate Calculator. És akkor úgy építed fel a rndszer, hogy IFunction, annak lesz egy Calculate meg egy CalculateDerivate metódusa.

L-M-et C#-hoz itt találtam: L-M C#, Java-st meg már linkeltek az előbb. Ez azonban meg fog halni ha non-singular a mátrixod. Szóval ebben le kell cserélni a dekompozíciót erre:
SVD decomposition.

És így már jó lesz. Sok sikert! előzmény

Eddig még sohasem használtam, csak annyit tudok róla hogy megkeresi fügvények minimum helyét ( ha jól értem ).

>>Google-t sem hasznaltad eddig, de tudtad, hogy megkeresi a problemad megoldasat..? előzmény
Google-t ismerem már és megtaláltam róla az angol leírásokat mind a wikipédián mind más helyeken, azonban ezek mindegyike angol, és az angolommal bajok vannak! ( legalábbis a matek szövegek még nem annyira mennek...) Max csak akkor rakok fel egy kérdést ha már nagyon sok időt eltöltöttem a kereséssel és nem találtam meg a megoldást... És mint kihangsulyoztam olyan implementációt keresek ( ha van ilyen ) aminél nem kell a parciális deriváltat kiszámolni! És én csak ilyen implementációval találkoztam ezért kérdezem tapasztaltabbakat meg lehet-e oldani nélküle, illetve van-e olyan implementáció valahol ahol ezt megoldották! előzmény
lusta voltam atolvasni a lenyeget, de nezd meg te hatha jo lesz neked : link előzmény
Ezt már megtaláltam én is =) úgy tűnik ebből parciális deriválás lesz :( előzmény
Nem ilyen egyszerű, mert az LU dekompozíció, amit itt az invertáláshoz használnak, nem megy non-singular mátrixokon (vagyis ha a determináns nem 0). L-M-hez SVD dekompozíció kell, amihez én megoldást csak fizetős libekben találtam eddig.

Ha találtok free-t, akkor én is megköszönném! előzmény
Ezt már megtaláltam én is =) úgy tűnik ebből parciális deriválás lesz

Mivel az egész L-M a Quasi Newtonra és a Gradient Descentre épül, nem tudod kihagyni a deriváltakat, mert kellenek a Hessian közelítéshez. Még az a szerencse, hogy a 2nd order deriváltak nem kellenek, mert az L-M JTJ-vel közelíti, nem úgy mint a Newton. előzmény
Amúgy mire kell ez? A végelszámolásnál az L-M csúnyán elvérzik például egy SCG-hez képest, mert amennyivel többet kell számolni, és amennyivel több adatot kell a memóriában tartani, annyival nem gyorsabb a konvergáció.

Lehet, hogy SCG-nél több iteráció kell, de ezeket olyan gyorsan és olyan kis memóriafogyasztás mellett tudod kiszámolni, hogy bőven-bőven ráver az L-M-re.

Amúgy meg egy sima, előjelváltáson alapuló adaptív Gradient Descent még ezekre is ráver takarékosságban és sebességben. előzmény
Hát nemtom én nem értek hozzá =) Ezért irtam is hogy jó lenne ha valaki elmagyarázná.....mert egy matlabos cuccot kell átírnom javara....

De matlabban fsolve-nél csak átadta a fügvényt, egy kezdő vektort meg az opciókat mást nem és abbol számolta ki neki az eredményt.

Mindenesetre ha valaki felvílágosítana a témában hogyan müködik a LM meg a Newtonos módszer annak örülnék =) előzmény
Ja, MATLAB, az mindent megmagyaráz. Abban a f.sban a legegyszerűbb gradient descentet is évekig tart kiszámolni, azért nem tűnik fel senkinek, hogy mennyire ótvar az L-M. Most gondolj bele! Iterációnként a teljes Jacobi, annak a transzponáltja, ezeknek szorzata, _majd ennek inverze - SMD-vel_, majd ezt beszorzod az identity * mű-vel, majd ezt a hiba vektorral ... és mindeközben a memóriában alapműveletenként új mátrix jön létre, ami egy 50+ változós fügvénynél már egész kellemes. :)

Sokat tud a MATLAB, az igaz, mert képes kiszámolni a deriváltakat is a függvényből, így azt nem kell átadni, de iszonyatosan büdös tetű beteg agyhalott lassú, nekem elhiheted.

Szóval a Java átültetéshez vagy úgy oldod meg, hogy a függvény mellett átadod a deriváltját is, vagy írsz egy függvény parsert, ami ki tudja számolni a deriváltat magától (mateknak matek, de ott van a függvénytáblában minden hozzá). Biztos van olyan Java lib, ami ezt tudja, de 10000%, hogy nem ingyenbe'.

De akkor még mindig kell egy olyan lib, ami képes SVD-re, ami szintúgy nem hinném, hogy Java-hoz van ingyenbe'. Azért utána lehet nézni.

Mi a feladat pontosan? előzmény
Hát ennél az esetnél konkrétan van egy egyenletrendszer a matlab programban és LM-mel megkeresem ennek a megoldását illetve keresem azt a helyet ahhol az egyenletrendszer megoldása nulla lesz...ha jól értetem =) (az egyenletrendszerekkel egy transzformáció paramétereit keresük stb...azért csinálták meg igy )

És ezt számolja ki matlabban!

Csak itt ugye az egyenletrendszert megcsinálták egy fügvényben, átadták a kezdő vektort meg az opciókat.

És a megbízom mondta hogy olyan LM java implementációt keressek lehetőleg, amivel ki lehet számolni így, anélkül hogy parciális deriváltat kéne ki számolnunk.

Tudsz esetleg jó c vagy c++ vagy c# implementációt ami képes így számólni? ( ha nagyon elszánt leszek le implementálóm javara =D )

Ez kb a feladat. De még nem teljesen vagyok tisztába az lm mükdésével se mert bár angolal felmásutt állok a wikipédia matek szövegét sehogy se vette be az agyam és fullra nem értem hogy mi a koncepciója és hogy műkődik egyálltalán!

Esetleg mellékesen, ha tudod hogy műkődik az LM letudnád írni nekem? előzmény
Hosszú lenne elmagyarázni, és a Wiki-n érthetően le van írva. Sajnos ebben a szakmában nem lehet úgy megélni, hogy nem tudsz angolul. Ha meg matematikai területen fejlesztesz, akkor a minimum, hogy ismerni kell az összes iteratív optimalizációt legalább elméleti szinten.

Sajna nem ismerek olyan implementációt a MATLAB-on kívül, ami magától ki tudja számolni a parciális deriváltakat. :(

Én már minden említésre méltó optimalizációt implementáltam C#-ban, csak neuronhálózatokhoz, ahol a parciális derivált nem okoz problémát, lévén a neuronok csak nagyon egyszerű függvények, amiknek nem kunszt megadni a deriváltjai kódban.

Saját tapasztalat, hogy az L-M csak elméletben hangzik olyan jól. Igen szép és komoly matematika van mögötte, azonban a gyakorlatban, ahol egy számítás sikerességét processzoridőben és memóriafelhasználásban mérjük, az L-M igen harmatosan teljesít.

Mi a konkrét program? Honnan jön az egyenlet? előzmény
Köszi a segítséget mostmár legalább képbe vagyok a dolgokkal, és azzal, hogy muszály lesz parciális deriváltat számolni!

Hát igazából ez egy képfeldolgozási algoritmus átírása matlabbol javaba nem matematikai. Bár a képfeldolgozáshoz komoly matek társul =)

Most végzek programtervező informatika Bsc-n csak úgy kiváncsiságból: te mivel foglalkozol így matematika területén belül, és mennyire tudsz megélni belőle?

Köszönöm a segítségedet mégegyszer! előzmény
Van egy (egyelőre még) garázsprojektem: NeoComp Framework. .NET 4-hez készül. Globális optimalizációkról, neuron és logikai hálózatokról szól az egész, 100% matek, még ki sem léptem a konzolos stádiumból vele, pedig már 2 éve dolgozom rajta.

Ilyeneket kezdett el tudni. előzmény
Sziasztok!

Szeretnék kérni egy kis segítséget (főleg tőled chikk). Hasonló dologgal kezdtem el foglalkozni, mint amiről ti is beszélgettek, sokat segített az értekezésetek, azonban nagyon sok, számomra ismeretlen rövidítést használtok. (LU, SMD, JTJ, SCG) Kérlek írjátok le legalább a teljes kifejezést rá, mert így google se nagyon dob semmit ezekre. Előre is köszi.

LyNX előzmény
Szia!

Ezek a rövidítések főként a közelítő és szimbolikus számítások (vagy numerikus matematika, így is hívják azt hiszem) témaköreiből származnak. Ezeket az algoritmusokat részben ott, részben más területeken használják. (Ennek a területnek nem én vagyok a legnagyobb szakértője =) ).

Az LU egy mátrix felbontásra utal: http://hu.wikipedia.org/wiki/LU_felbont%C3%A1s

Az SMD-vel kapcsolatban ezt találtam: http://justindomke.wordpress.com/stochastic-meta-descent/ Elvileg a jelentése Stochastic Meta-Descent erre keresve talán több információt találhaszt róla.

JTJ-vel kapcsolatban is találsz a neten infokat ha JTJ Numerical, JTJ Matrix és egyéb módokon keresel rá. (lehet régen tudtam mi ez, de mióta nem használtam ezt a tudást, kicsit megkopot).

Mindenesetre ezek mind főként a Közelítő és szimbólikus számítások (numerikus matematika) témaköreihez kapcsolodnak. Ezzel kapcsolataban keresve a dolgokra találhatsz angol és magyar nyelvű anyagokat. Mihez kell amúgy ez a tudás?

Amúgy ha LM kell java-ra, végül sikerült találnóm anno egy ingyenes implementációt, amit tudtam használni és igen hatékony volt (egy külföldi egyetem leimplementált egy fortran numerikus csomagot java-ra). Ha esetleg kell, akkor írj és előtúrom a linket =)

ui.: Bocs a helyesírásért (mindig is gyenge voltam belőle =) ) előzmény
Köszönöm szépen a választ. Így már lényegesen egyszerűbb lesz :)

A kódra visszatérve, köszi, a link jól jönne. (Leginkább C-ben fejlesztek, és amit chikk mondott az L-M ről, nos nem valami bizalomgerjesztő, de vetnék rá egy pillantást.) Viszont mondott számos más megoldást, de úgy, hogy nem tudom a rövidítéseket, bajos lett volna egyet is implementálni. :D Egy hatékony, és nem túl energiaigényes kódot akarok írni, a beszélgetés alapján van rá némi sansz, hogy létezik ilyen.

Igazából van egy forrásfájlom egy mérésből, és azt szeretném feldolgozni, de kell egy illesztő rutin, mert zavaros a jel.

Üdv: LyNX

előzmény
Oszd meg!