Kezdőoldal » Számítástechnika » Programozás » Ehhez te milyen algoritmust...

Ehhez te milyen algoritmust használnál? (Jelfeldolgozás)

Figyelt kérdés

Folyamatosan érkeznek a mérési eredmények és nekem az a "pillanat" kellene, amikor a jel rövid idő alatt esik nagyot. Készítettem egy képet: [link]


A pontok jelölik azokat amit szeretnék az outputban látni, a piros pont a lecsengés időpontját, a zöld pont pedig azt jelzi, hogy honnan esett. Ilyesmire gondoltam kimenetként:


100,-2.8

120,-4.3

150,-6.01

200.-8.01

stb.


(A felső kép alapján, ránézésre becsülve az értékeket)


Lényeges, hogy amikor meredeken esik az érték (a grafikonon ilyenkor összesűrűsödve látszanak a vonalak), akkor ne adjon jelzést, csak amikor egyenletesen közelít az érték a 0-hoz. És az is lényeges lenne, hogy minnél hamarább kiszúrja, hogy mikor kezdett el csökenni, a csúcshoz képest max. 10 mérés után. (De talán már 5 után is megállapítható.)



Itt van egy ~6700 mérést tartalmazó txt fájl teszteléshez: ***** (Nagy szürke "Lassú letöltés" képre kattintva)


Van ötletem rá, de az túl bonyolult, így hát reménykedem benne, hogy valaki itt tud rá jobb megoldást!



* Automatikusan eltávolított tartalom.
2011. aug. 16. 20:13
 1/6 anonim válasza:

"ránézésre becsülve az értékeket"

Ezt sajnos nem lehet algoritmizalni... Valahogy definialnod kell a pontokat, kulonben nem lehet kiszedni az adatokat. :-( Definialni kell tovabba azokat a tartomanyokat, ahol ne adjon kimenetet (besurusodes). (gyanitomm, valamilyen ingadozasa lehet a muszernek.) Nem segiti tovabba elo a dolgokat, hogy neha lefele, neha folfele allnak a csucsok...


A piros pont az x adat, a zold az y? Mert mind a old, mind a piros ponthoz tartozik x,y adat...


Szoval elobb kellene meg egy kis informacio.

2011. aug. 16. 21:02
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:
100%

1. Az első fontos lépés, hogy minden egyes beérkező mérésnek legyen egyedi azonosítója, nevezzük ezt most INDEXNEK. Ha ez megvan, akkor új adat beérkezésénél megnézed, hogy a legújabb indexű mérés értéke az egyel előtte lévő (egyel kisebb) indexű mérés értékétől milyen mértékben tér el, hívjuk ezt KÜLÖNBSÉGNEK az egyszerűség kedvéért.


2. Itt jön be a másik fontos dolog, hogy egy konstans DIFFERENCIÁT meg kell adnod az algoritmusban, amelynek az értékét ki kell kísérletezni, mert ha túl kicsi, akkor túl érzékeny lesz a program, ha túl nagy, akkor pedig lehetséges találatokat nem fog mutatni.


3. Na és akkor ha a (különbség abszolút értéke a differencia abszolút értékénél nagyobb) ÉS (a különbség és a legújabb indexű érték szorzata negatív)..


//Kis kitérés: az utóbbi feltétel azért kell, mert csak azok az események jók, amikor nullához tart az úgymond "függvény". Na most tegyük fel, hogy éppen bekövetkezik ez az esemény. Ilyenkor ha a legújabb indexű érték pozitív, akkor különbségnek negatívnak kell lennie, így ezek szorzata negatív lesz. Ha pedig negatív a legújabb indexű érték, akkor a különbségnek pozitívnak kell lennie, így ezek szorzata is negatív lesz. Ha pozitív a szorzat, akkor távolodik a fiú a nullától, ugye ilyenkor nem lehet esemény.


..akkor az index-1 lesz az esemény kezdete, ezt egy KEZDET nevű változóba lemented. A KEZDET egy olyan változó legyen, amelyet megvizsgálsz beleírás előtt, ha éppen nem folyik esemény (üres a változó), akkor beleírod az index-1 et, ha pedig nem üres, akkor folyik egy esemény (az éppen folyó esemény kezdő indexe van benne), ekkor nem bántod a kezdet változót.


4.A következő feltétel nagyon fontos ezután, az előbbi feltétel második részét írod meg magában (kombinálhatod az előzővel, de így is elég bonyolult már, elmagyarázni így könnyebb), azaz megnézed minden egyes adatnál, hogy a különbség és a legújabb indexű érték szorzata negatív-e. Ha nem, akkor a kezdet nevű változót kiüríted, akkor biztosan nincs esemény, biztosra megyünk. :)


5. Ha a különbség abszolút értéke a differencia abszolút értékénél kisebb, akkor megnézed, hogy a KEZDET változóban van-e valamilyen index, és eszerint kétféle képen járhatsz el. Ha van benne valami, akkor a KEZDET lesz az esemény kezdete, és a mostani index a vége, tehát tudod egy eseménynek a kezdetét és a végét, és mivel indexelted a beérkező adatokat, vissza tudod majd keresni az akkori értékeket, azokat megfelelő módon kiíratod valahova. Ezután a KEZDET változót kiüríted, hogy jöhessen az újabb esemény. Ha viszont alapból üres a változó, akkor semmit nem teszel.


6. Itt jön még be egy kisebb csavar, ami neked kellene:

"Lényeges, hogy amikor meredeken esik az érték (a grafikonon ilyenkor összesűrűsödve látszanak a vonalak), akkor ne adjon jelzést.."

Ezt barátom még nekem is nehéz eldönteni a feltöltött képed alapján, hogy melyik esemény is igaz akkor (az alsó képen jobb oldalról a 2. például kérdéses). Én erre annyit tudok mondani, hogy amennyire megfigyeltem ezt a témát, neked olyan hirtelen dolgok jelentik az eseményt, amelyek jelentősen megközelítik a nullát, szóval egy olyan feltételt kell majd az 5. pont végébe írnod (minden más marad), hogy csak akkor hiteles az esemény (ha nem hiteles, akkor a kezdet változót kiüríted), ha a végét jelző indexű adat értékének nullától való abszolút eltérése kisebb, mint valami konstans, amit ugyanúgy ki kell majd kísérletezned, mint a differenciát.


7. A következőt pedig:

"És az is lényeges lenne, hogy minél hamarább kiszúrja, hogy mikor kezdett el csökkenni, a csúcshoz képest max. 10 mérés után. (De talán már 5 után is megállapítható.)"

Nem lehet megcsinálni, mert sűrűn jönnek az adatok, ha 10 mérés alatt befejeződik egy esemény, akkor azt megtalálja az algoritmus, ha pedig nem, akkor Te is láthattad mennyire ugrál össze-vissza néha a függvény, az úgy csak jóslás lenne, sokszor téves eredményt kapnál.



Átnéztem egy párszor, ennek így azt hiszem működnie kell, remélem nem írtam el semmit. Más dolog, hogy a Te "túl bonyolult" ötleted lehet ennél egyszerűbb lenne. Az biztos, hogy párszor át kell olvasnod, hogy megértsd. Fogalmam sincs, hogy ezt milyen programozási nyelven és felületen szeretnéd megírni, nem egyszerű feladat, de ahogy látom kb. ez egy potenciális megoldás rá, ennyit tudtam segíteni.


Sok sikert! :)

2011. aug. 16. 21:44
Hasznos számodra ez a válasz?
 3/6 A kérdező kommentje:

Köszönöm a válaszokat!


Utolsó: hát eléggé megbonyolítottad! Csak átfutottam a válaszodat, aztán elkezdtem megvalósítani azt amire én gondoltam és sikerült leegyszerűsíteni.


A lényeg az, hogy észrevettem hogy a "lecsengés" mindig egy adott függvény alapján zajlik:



3283 -3.6389 1

3284 -1.8195 0.50001374

3285 -1.213 0.333342494

3286 -0.9097 0.24999313

3287 -0.7278 0.200005496

3288 -0.6065 0.166671247

3289 -0.5198 0.142845365

3290 -0.4549 0.125010305

....

6702 6.8012 1

6703 3.4006 0.5

6704 2.2671 0.333338234

6705 1.7003 0.25

6706 1.3602 0.199994119

6707 1.1335 0.166661766

6708 0.9716 0.142857143

6709 0.8501 0.124992648


Innentől meg már elég egyszerű azt megnézni, hogy a csúcshoz képest az 5. érték a csúcs ~20 százaléka-e.


Ha érdekel titeket a megoldás, megmutathatom, php-ban 20 sor az egész.

2011. aug. 17. 00:06
 4/6 A kérdező kommentje:
(Az első példa esetében a zöld pont 3287, a piros pedig -3.6389)
2011. aug. 17. 00:09
 5/6 anonim válasza:
Hat, vannak fenntartasaim, hogy ezt valoban meg lehet-e oldani 20 sorban, ugym hogy a megoldas megfeleljen a specifikacionak... Mindegy, szivesen latnam lekodolva. ajanlom figyelmedbe a pastebin.com-ot szoveges fileok, forraskodok megosztasara.
2011. aug. 17. 01:17
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:

Itt a kód: [link]


Nem tudom mennyire vagy járatos phpben, de ha a perlt ismered, akkor szerintem ezt is megérted, talán még optimalizálni is tudod. :)



Érdekes(?) módon vannak pici ingadozások is, amikor egy csúcs után csökken, de lineárisan. Pl:


401 -0.0558 -

402 -0.0546 +

403 -0.0534 +

404 -0.0523 +

405 -0.0512 +

-0.0512 / -0.0558 = 0.9 ?


Ezek mindig ~0.01 körüli értékeknél van, sose a nagyobbaknál.

2011. aug. 17. 07:34

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!