Adatelemzés
Sziasztok!
Adott egy MySQL vagy PostgreSQL tábla, ami eseményeket tartalmaz, nagyjából 2 és fél milliót. Az egyszerűség kedvéért legyen benne két mező: esemény időpontja, objektum azonosítója (amivel az esemény történt).
A feladat az, hogy megkeressem azokat az objektumokat, amelyekkel gyakran történik meg nagyjából egy időben az esemény.
Én első közelítésben arra gondoltam, hogy készítek egy lekérdezést (MySQL verzióban), amelyik összeszedi, hogy azonos perceken belül mely objektumokkal történt esemény, és ezekben keresek ismétlődő mintákat. Valahogy így:Egyből látszik a hátrány: csak azok az esetek gyűjthetők ki ezzel, amelyeknél nem "lóg át" másik percbe egy-egy elvileg oda kapcsolódó esemény. Persze ha elég gyakori az eset, akkor valószínű, hogy találunk olyat, aminél nem lóg át, és ez már részleges eredményt hozhat, találhatunk párat. Feltéve persze, ha van egyáltalán ilyen... ezt sajnos nem tudjuk.
Ti hogyan állnátok neki? Van ilyesmire bevált módszer, eljárás?
(A kategóriaválasztás esetleges, a téma ebben a tálalásban inkább elméleti, de a megvalósítás - az adatbázisokon kívül - PHP-ben kell/lesz.)
■ Adott egy MySQL vagy PostgreSQL tábla, ami eseményeket tartalmaz, nagyjából 2 és fél milliót. Az egyszerűség kedvéért legyen benne két mező: esemény időpontja, objektum azonosítója (amivel az esemény történt).
A feladat az, hogy megkeressem azokat az objektumokat, amelyekkel gyakran történik meg nagyjából egy időben az esemény.
Én első közelítésben arra gondoltam, hogy készítek egy lekérdezést (MySQL verzióban), amelyik összeszedi, hogy azonos perceken belül mely objektumokkal történt esemény, és ezekben keresek ismétlődő mintákat. Valahogy így:
SELECT perc,GROUP_CONCAT(objektum ORDER BY objektum separator ",") FROM esemenyek GROUP BY perc
Ti hogyan állnátok neki? Van ilyesmire bevált módszer, eljárás?
(A kategóriaválasztás esetleges, a téma ebben a tálalásban inkább elméleti, de a megvalósítás - az adatbázisokon kívül - PHP-ben kell/lesz.)
Lassú lesz
SELECT COUNT(objektum) WHERE ido >= (eredeti_objektum_timestamp - 60) AND ido <= (eredeti_objektum_timestamp + 60);
A feladat az, hogy
Egyik sem. :)
Például ha az objektumok gépek, az esemény pedig az, hogy hibázik a gép, akkor a feladat az, hogy megkeressük azokat, amelyek gyakran hibáznak egyszerre.
SELECT e1.esemeny,
miért nem szkript?
ezekből ahogy berakod az újakat ki is veheted a régieket, hogy ne nőjenek hatalmas méretűre.
szerintem rugalmasabb megoldást kapsz így, és a teljesítménye sem lesz azért annyira rossz, ha jól csinálod.
Első körben kellenek teszt
A második kört már leírták mások, meg lehet ezt csinálni elég egyszerű algoritmussal is... Ha valami bonyolultabb statisztikai módszert használnál, akkor olvasgass itt: http://lmgtfy.com/?q=data+mining+temporal+patterns
Ha megokosodtál data mining témában, akkor én szívesen olvasnék cikket, vagy legalább egy rövid leírást róla... ;-) Ha esetleg elakadnál írj nyugodtan, illetve, ha meghaladja a mi statisztikai képességeinket a dolog, akkor itt biztosan tudnak segíteni: http://stats.stackexchange.com/