Sziasztok!
Nem tudná valaki megmondani, hogy hogy lehet korlátozó feltételeket megadni a gnuplot fit parancsánál (vagy előtte, ahogy csak lehet) a paraméterekre vonatkozóan. Azt szeretném, hogy egy illesztésnél bizonyos paraméterek érteke a [0;1] intervallumban vehessen csak fel értékeket.
Köszönöm!
Oszi
- 1580 megtekintés
Hozzászólások
Triviálisan nem tudod megcsinálni.
Azzal próbálkozhatsz, hogy két paramétert használsz, az egyik értéke tetszőleges lehet és ezt adod meg a 'fit' parancs paramétereként, a másik pedig a valódi, fizikai jelentéssel bíró paraméter, ami korlátos - a kettő között pedig egy alkalmas leképezés teremt kapcsolatot.
Lásd: http://groups.google.com/group/comp.graphics.apps.gnuplot/browse_thread…
- A hozzászóláshoz be kell jelentkezni
Így megy is: pl. (sin(c)+1)/2 beteszi a [0;1] intervallumba, ez nem is gond. Viszont kihagytam egy fontos részletet: igazából három ilyen paraméter van, és azon kívül hogy a [0;1] intervallumba kell, hogy essenek, az összegük 1 kéne, hogy legyen. Erre valakinek valami ötlete?
- A hozzászóláshoz be kell jelentkezni
Ha az teljesen fix, hogy a három paraméter összegének 1-nek kell lennie, akkor igazából csak két független paramétered van:
a és b, a harmadik már adódik 1-a-b alakban.
A két független paraméterre pedig a fenti transzformációt alkalmazni tudod.
Igazából a gnuplot illesztő algoritmusa nem is szereti, ha a paraméterek nem függetlenek.
- A hozzászóláshoz be kell jelentkezni
Igen, erre én is gondoltam, de akkor semmi nem garantálja, hogy az 1-a-b is a [0;1] intervallumba essen. Márpedig kéne.
- A hozzászóláshoz be kell jelentkezni
Elárulod, hogy konkrétan mit akarsz illeszteni mire? Talán akkor többre megyünk.
Amúgy lehet, hogy ez a feladat túlnő a gnuplot képességein, és mást kell keresned.
Lehetséges irány több is van: R, octave, saját megoldás valamelyik matematikai könyvtárat használva...
- A hozzászóláshoz be kell jelentkezni
Persze. Üledékek szemcseméreteloszlásának modellezéséről van szó. Három komponensből kell összerakni, ami három Weibull eloszlás lenne. Azaz az illesztendő függvény ilyen alakú:
c1*(a1/b1**a1)*x**(a1-1)*exp(-(x/b1)**a1)+c2*(a2/b2**a2)*x**(a2-1)*exp(-(x/b2)**a2)+c3*(a3/b3**a3)*x**(a3-1)*exp(-(x/b3)**a3)
ahol c1, c1, c3 eleme [0;1] és c1+c2+c3=1
(merthogy a három eloszlás kombinációja azt jelképezné, hogy a három komponens milyen arányban alkotja az üledéket és nyilván nincs olyan komponens, ami -20%-ban van jelen).
- A hozzászóláshoz be kell jelentkezni
Még esetleg futhatsz egy kört a fent linkelt newsgroupban is, hátha mondanak rá valami okosat.
Ha mindhárom paraméterre elvégzed a fentebb leírt transzformációt (azaz a valódi c1, c2, c3 paramétereket [0,1]-re korlátozod), és úgy illesztesz, akkor mi jön ki a három paraméter összegére?
- A hozzászóláshoz be kell jelentkezni
Mindegy, mi jön ki, 0 az esélye, hogy az összegük egy legyen, és mivel itt %-os megoszlásként kell őket implementálni, értelmetlen lesz az eredmény.
- A hozzászóláshoz be kell jelentkezni
Ha jol latom, ez (c1,c2,c3)-ban linearis. az viszont hatarozottan nagy elony (egzaktul megoldhato, stb). A kenyszered (c1+c2+c3=1) is linearis, igy akar a c3=1-c1-c2-t hasznalod, akar egy lambda-multiplikatoros megoldast, mindket esetben egy sima linearis egyenletrendszered lesz. szerintem irj egy par soros tetszoleges nyelvu (javaslom az awk-t, pl) ami megoldja ezt az egesz problemat. A gnuplot tapasztalat szerint hajlamos akkor is elszallni, ha a problema egzaktul megoldhato linearis ize.
Egyebkent pont a linearitas miatt a [0,1] kenyszereidet nem egyszeru hasznalni. A lin. egyenlet megoldasara vagy teljesul ez, vagy nem (marmint hogy mind3 parameter a [0,1]-ben van). Ha nem teljesul, akkor az egesz problemakor mar mas (asszem ezt hivjak "linearis programozas"-nak, de javitsatok ki ha nem, szoval a linearis egyenlotlensegrendszereket).
A.
- A hozzászóláshoz be kell jelentkezni
Ha jól értem, a többi paramétert ([ab][1-3]) is illeszteni kell, azokban pedig már nem lineáris a függvény.
Azt hasból leprogramozni, hogy egy ennyire bonyolult nemlineáris függvényt illesszen az adatokra, már nem triviális. A gnuplotnak éppen menne, csak azzal meg a c1+c2+c3=1 kényszer erőltetése nehéz.
- A hozzászóláshoz be kell jelentkezni
De, (c1,c2,c3)-ban linearis, mert c1*A1+c2*A2+c3*A3 alaku, ahol Ai csak kulso parameterktol fugg... szoval ez teljesen sima u"gynek nez ki, leszamitva a fenti aprosagot (ha az egzakt megoldas a [0,1]^3-on kivulre esik).
A.
- A hozzászóláshoz be kell jelentkezni
Sokra megy vele, ha egyszer azok a további paraméterek sem ismertek, azokat is az illesztésből kell meghatározni... nem?
- A hozzászóláshoz be kell jelentkezni
igen, most igy visszaolvasva valoban nem egyertelmu hogy a kollega csak azokat a parametereket akarja illeszteni, amikre ezek (kenyszer, intervallum) igazak, vagy az osszes tobbit (a_i, b_i) is. ha ezutobbi, akkor a fenti eszmefuttatas a linearis izekrol persze bukta.
amit me'g be lehet vetni az vmifele monte-carlo alapu illesztes, ami viszont ezutobbi esetben (ha a_i, b_i, stb is ismeretlen) celravezetobb is lehet, mint a levenberg-marquard algoritmus. Kis reklam: itten van egy hazi fejlesztesu program (lfit), amit anno me'g ponta gnuplot reszben fent hivatkozott nyugjei miatt kezdtem csinalni, ezzel is meg lehet nezni, hogy mit
ad. Pl vhogy igy:
lfit input.dat \
-c x,y
-v a1=...,b1=...,c1=...,a2=...,b2=...,c2=...,a3=...,b3=...,c3=... \
-f "c1*(a1/b1^a1)*x^(a1-1)*exp(-(x/b1)^a1)+c2*(a2/b2^a2)*x^(a2-1)*exp(-(x/b2)^a2)+c3*(a3/b3^a3)*x^(a3-1)*exp(-(x/b3)^a3)" \
-y y \
-t c1+c2+c3=1 \
-N
(-N helyett lehet -X, vagy egyeb nemlin modszer, tovabbi info:
lfit --long-help
). Ha tenyleg csak a c1,c2,c3 az ismeretlen, akkor ertelemszeruen egyszerusodik a problema, es akkor -N sem kell. E fenti program tudja kezelni az intervallumokat is, ekkor igy kell csinalni: ...,c1=0.5[0:1],... (hasonloan a tobbire is), de asszem csak monte-carlo modszerekre.
Ja igen, minden nemlinearis illesztesztesnel a parametereknek kell adni vmi kezdeti erteket. Ugyanez igaz a gnuplot-ra is. tehat ha az a1...c3 parameterek ertekeirol akkor is nyilatkoznunk kell (valami otlet, megerzes, fizika, stb alapjan), ha torik, ha szakad... a sima linearis illesztesnel ez nem kotelezo" (vagyis opcionalis, semmi hatassal nem lesz az eredmenyre :])
A.
- A hozzászóláshoz be kell jelentkezni
Ezt az lfit-et elteszem, köszi.
A Monte-Carlo alapú illesztésre tudsz irodalmat adni (vagy pár mondatban elmondani az elvét)?
Azt pedig gondolom az OP is tudja, meg mindenki, aki már háromnál többször használta a gnuplot fit parancsát, hogy a nemlineáris illesztésnél kezdőértékeket kell adni a paramétereknek. Az egész gyakori, hogy a gnuplot gyári kezdőértékeivel (1) semmire sem megy, és az is elő szokott fordulni, hogy nem megfelelő kezdőértékeket választva az algoritmus beássa magát valamelyik lokális minimumba, ami nem a helyes illesztett paramétereket fogja adni, és ettől a meggyőződésétől nehéz is eltántorítani.
- A hozzászóláshoz be kell jelentkezni
A Monte-Carlo alapú illesztésre tudsz irodalmat adni (vagy pár mondatban elmondani az elvét)?
Ketfajta koncepcioju MC van, amit ugy szoktak hasznalni gyakrabban (es a fenti progi is ezeket tudja):
- az egyik az a ``bootstrap'' modszer, hogy megilleszted (valahogy) a fuggvenyt, es a legjobban illeszkedo" modellfuggvenyt az eredeti jeleddel hasonlo random zajjal elrontod. Ezt az igy kapott adatsort is megilleszted, es kapsz egy kicsit mas parameter-vektort. Majd ezt megismetled sokszor. Ezutobbi mesterseges adatsorok legjobb illeszkedesei kiadja'k a parameterek hibait es korrelaciot. Ez a modszer ``csak'' hiba'k becslesere hasznalhato, a fenti ``valahogy'' lenyegeben barmilyen illeszto"-minimalizalo procedura lehet (sima linearis illesztes, levenberg-marquardt, downhill simplex, stb).
- a masik az a markov chain monte carlo (MCMC) algoritmus. ez egy kicsit trukkosebb, wikipedia-n az elve le van irva, meg asszem a legujabb kiadasu NumRec is targyalja (amit viszont mar nem lehet "csak ugy" letolteni, azt ma'r meg kell venni).
választva az algoritmus beássa magát valamelyik lokális minimumba, ami nem a helyes illesztett paramétereket fogja adni,
ez sajnos igy van. de a gnuplot-ban az is egy bug, lenyegeben, hogyha sima linearis a fuggvenyed (marmint az illesztendo parameterekben) akkor is az L-M modszert hasznalja, ami -- fuggetlenul attol hogy hany meg milyen minimum van -- maga'tol is be tud szarni rossz kezdoertekeknel...:/
- A hozzászóláshoz be kell jelentkezni
Mint a másik kolléga kiókumulálta, 9 paramétert kell meghatározni az illesztés során: [abc][1-3].
És bárcsak lin. progr. lenne a dolog, akkor nem kéne itt vackolni vele.
- A hozzászóláshoz be kell jelentkezni
Egyebkent nem kotozkodes, de biztos jo igy ez a fuggveny? ezek az a1/b1^a1 alaku tagok kicsit furcsanak tunnek. a1 osztva b1-nek az a1-edik hatvanyaval? miert kell ott a1? nem lehet annak a "hatasat" belegyu'rni a c1-be? azaz d1/b1^a1*x^(a1-1)*...-t illesztesz, es akkor a vegen c1=d1/a1 lesz?
- A hozzászóláshoz be kell jelentkezni
A Weibull eloszlás ilyen alakú. Itt meg három Weibull-eloszlás konvex lineáris kombinációjáról van szó tulajdonképpen. Nem nagyon gondolkodtam, mit hogy lehet belegyúrni mibe, nekem úgyis ezek a paraméterek kellenek a végén.
update: Megnéztem, persze, hogy lehet úgy csinálni, ahogy írod, de úgy ugyanúgy 9 paraméter van, és a d[1-3]-makkal hogyan kezeled a c1+c2+c3=1 és a c[1-3]>=0 feltételeket? Szvsz csak bonyolítja a problémát.
- A hozzászóláshoz be kell jelentkezni
Igen, R-et úgyis használgatok, bár nem pont illesztésekre, de megnézem. Az octave-ot meg úgyis meg akartam ismerni. Csak most szorítana az idő, de ha nem megy...
- A hozzászóláshoz be kell jelentkezni
gnuplottal en sem tudnam meg csinani (!= nem lehet), de az en 5 centem:
root.cern.ch -> download, feltenni kn 20 perc (ha ferdited), aztan a
tutorials/fit konyvtarban szetnezegetni
gyakorlatilag irsz egy fuggvenyt, ami kiszamolja a fuggvenyedet
double fuggveny(double* x, double* par){
//az x az azert array, mert hat tobb dimenzios a fuggvenyed, akkor x[0]=x, x[1]=y ...
a = par[0];
b = par[1];
x = x[0];
return (a/pow(b,a))*pow(x,(a-1))*exp(-pow((x/b),a));
}
double sumfuggveny(double* x, double* par){
c1 = par[0];
c2 = par[1];
if(0 <= (1-c1-c2) && (1-c1-c2) < 1){
return c1*fuggveny(x, &par[2]) +
c2*fuggveny(x, &par[4]) +
(1-c1-c2)*fuggveny(x, &par[6]);
}else
return 0;
}
a fit meg a kovetkezokeppen megy:
vannak az osszetartozo ertekparok (esetleg error?) az X es Y vektorokban, amelyeknek N eleme van
fit(){
TF1* f1 = new TF1("f1", sumfuggveny, xmin, xmax, 7);
//fuggveny ertelemezesi tartomanya [xmin, xmax] es 7 parametere van
f1->SetParLimit(0, 0, 1);
f1->SetParLimit(1, 0, 1);
// ez adja meg a limiteket a ket amplitudora
// (melyikparameter, alsolimit,felsolimit)
//f1->SetParameter(2, ...);//setting initial parameter a fitnek
//f1->FixParameter(3, ...);//Fix parameter
//f1->FixParameter(4, ...);//Release parameter
TGarph* gr = new TGraph(N, X, Y);
//X es Y N elemu tombok ... lasd feljebb
tg->Fit(f1, "ler");
//fit log-likelihood-dal ('l'),
//"jobb" error-becslessel, ('e').
//a fuggveny altal definialt ertelmezesi tartomanyon ('r');
}
A fit a hiresneves MINUIT-ot hasznalja a MIGRAD-dal (dokumentaciot a neten konnyen talalsz)
Persze 7 parameterhez trukkozni kell (fixalni elengedni parametereket ...) a MIGDRAD gradiebnst szamol, szoval
ha a kezdo parameterek nem eleg jok, a fuggveny nem linearis, es tul sok szabad parameter van, akkor konnyen elszall ...
ajanlom a dokumentacio fittolasrol szolo reszet (vsz valami uj, de nagyon konnyen bele lehet jonni), es a TFitPanel
nevu grafikus applikaciot ...
... ja ... es hogyan kell futtatni ...
megirod a beolvaso-algoritmust, ami megkrealja az X es Y tombot (*), osszemasolod a fuggvenyeket, a beolvasoreszt meg a fittolas kodot
egy fajlba, (ahol akkor van a 'fuggveny', 'sumfuggveny', 'fit' es a beolvaso fuggveneyd ... legyen a fajl neve fit.C) beinditod a root-ot ("root" a command-line-ba) es az interpreterjebol futtatod a kododat (.x fit.C [a kodnak abban a konyvtarban kellene lennie, ahonnan futtatod a root-ot ...])
ekkor az adataidat es fitfuggvenyt is megkapod egy canvasban ... ami szinezheto, feliratozhato, miegymas ...
[*van erre 1-soros megoldas, de a konvenciok miatt maceras leirni ...]
Szoval root-site: root.cern.ch
forum : http://root.cern.ch/phpBB2/
doksi : http://root.cern.ch/drupal/content/users-guide
fittolasi peldak: http://root.cern.ch/root/html/tutorials/fit/index.html
doxygen-szeru doksi: http://root.cern.ch/drupal/content/reference-guide
amennyiben hibaid is vannak, akkor ajanlom a TGraphError-t a TGraph helyett ...
remelem szereztem egy uj rajongot a ROOT-nak ...
k
- A hozzászóláshoz be kell jelentkezni
Hmmm...
- A hozzászóláshoz be kell jelentkezni
a level hosszu lett, de ha osszeszamolod kb 10-15 sor a kod amit implementalni kell (meg az adataid beolvasasat ...)
A minuit elegge szeles korben hasznalt, legalabbis fizikaban, letezik neki standalone verzioja, de annak a hasznalata egy kicsit komplikaltabb (habar ha az ember ipari meretekben fittol, akkor hasznos abba is belejonni ...): http://c-minuit.sourceforge.net/
A root meg egy kicsit agyuval verebre, de egy rakat dolgot megcsinaltak (pld a minuit kore) ami meg az is lehet hogy hasznos.
na nem csinalok tobb reklamot neki ...
Probladd feltelepiteni, es adjal neki 20 percet (tutorials/fit konyvtarat vegigjatszva ...) ha nem tetszik, akkor nem tetszik ...
Maskulonben debian repositorikban benne szok' lenni ... a tobbirol meg nem tudok ...
k.
- A hozzászóláshoz be kell jelentkezni
volt csomag az ubuntu repo-ban, már fent is van. 20 percem még nem volt rá, de majd megnézem.
- A hozzászóláshoz be kell jelentkezni