Hmmm, dit lyk hierdie quoteasy te funksioneer implementquot is eintlik redelik maklik om te kry verkeerd en het 'n goeie gesprek oor geheue doeltreffendheid bevorder. I39m gelukkig om opblaas het as dit beteken dat die wete dat something39s is reg gedoen. â € Richard September 20 14 by 19:23 NumPys gebrek aan 'n spesifieke domein-spesifieke funksie is dalk te danke aan die Core Spanne dissipline en getrouheid aan NumPys eerste aanwysing: bied 'n N-dimensionele skikking tipe. asook funksies vir die skep, en kruip die skikkings. Soos baie fundamentele doelwitte, hierdie een is nie klein en Numpy doen dit briljant. Die (baie) groter Scipy bevat 'n veel groter versameling van domein-spesifieke biblioteke (genoem subpakette insluit deur Scipy devs) - byvoorbeeld, numeriese optimalisering (optimaliseer), sein Verwerk (sein), en integraalrekening (integreer). My raaiskoot is dat die funksie wat jy soek is in ten minste een van die Scipy subpakette insluit (scipy. signal miskien) Maar ek sal eers kyk in die versameling van Scipy scikits. identifiseer die relevante scikit (s) en kyk vir die funksie van belang daar. Scikits is (bv scikits-beeld. Scikits-leer. Ens) onafhanklik van mekaar ontwikkel pakkette wat gebaseer is op Numpy / Scipy en gerig word aan 'n bepaalde tegniese dissipline Verskeie van hulle was (in die besonder, die ontsagwekkende OpenOpt vir numeriese optimalisering) is hoog aangeskryf, volwasse projekte lank voor die keuse onder die relatief nuwe scikits rubriek te woon. Die Scikits tuisblad graag bogenoemde lyste ongeveer 30 sulke scikits. al ten minste 'n paar van diegene nie meer onder aktiewe ontwikkeling. Na aanleiding van hierdie raad sal jy egter lei tot scikits-tijdreeksen, wat pakket is nie meer onder aktiewe ontwikkeling In effek, het Pandas geword, AFAIK, die de facto Numpy - gebaseerde tydreekse biblioteek. Pandas het verskeie funksies wat gebruik kan word om 'n bewegende gemiddelde die eenvoudigste van hierdie is waarskynlik rollingmean bereken. wat jy gebruik soos so: Nou, net noem die funksie rollingmean verby in die reeks voorwerp en 'n venster grootte. wat in my voorbeeld hieronder is 10 dae. bevestig dat dit gewerk het - Bv. in vergelyking waardes 10 - 15 in die oorspronklike reeks teenoor die nuwe reeks reëlmatige met rollende beteken Die funksie rollingmean, saam met ongeveer 'n dosyn of so ander funksie is informeel gegroepeer in die dokumentasie Pandas onder die rubriek beweeg venster funksies 'n tweede, wat verband hou groep funksies in Pandas word na verwys as eksponensieel-gelaaide funksies (bv ewma. wat eksponensieel bereken beweeg geweegde gemiddelde). Die feit dat hierdie tweede groep is nie ingesluit in die eerste (bewegende venster funksies) is miskien omdat die eksponensieel-geweeg transforms hoef staatmaak op 'n vaste-lengte windownumpy. average Axis waarlangs om gemiddeld 'n. As een. gemiddelde gedoen oor die plat skikking. gewigte. arraylike, opsioneel 'n verskeidenheid van gewigte wat verband hou met die waardes in 'n. Elke waarde in 'n bydrae lewer tot die gemiddelde volgens sy verwante gewig. Die gewigte array kan óf 1-D (in welke geval moet sy lengte van die grootte van 'n langs die gegewe as wees) of van dieselfde vorm as 'n. As weightsNone. dan sal al die data in 'n word aanvaar dat 'n gewig gelyk aan een het. teruggekeer . Bool, opsionele Standaard is Vals. As dit waar is. die tuple (gemiddelde. sumofweights) teruggestuur, anders net die gemiddelde teruggestuur. As weightsNone. sumofweights is gelykstaande aan die aantal elemente waaroor die gemiddelde geneem. gemiddelde, sumofweights. arraytype of dubbel terug die gemiddelde langs die gespesifiseerde as. Wanneer teruggekeer waar is. terugkeer 'n tuple met die gemiddelde as die eerste element en die som van die gewigte as die tweede element. Die tipe terugkeer is Float as a van heelgetal tipe, anders is dit van dieselfde soort as 'n. sumofweights is van dieselfde soort as die gemiddelde. I onlangs geleer het oor vordering in die antwoord op hierdie post. en het gewonder hoe ek dit kan gebruik om 'n bewegende gemiddelde filter meer doeltreffend te bereken as wat ek in hierdie pos voorgestelde (met behulp van konvolusie filters). Dit is wat ek tot dusver. Dit neem 'n blik op die oorspronklike skikking rol dit dan deur die nodige bedrag en som die kern waardes van die gemiddelde te bereken. Ek is bewus daarvan dat die kante nie korrek hanteer word nie, maar ek kan sorg van daardie daarna neem. Is daar 'n beter en vinniger manier Die doel is om 'n groot swaai punt skikkings filter tot 5000x5000 x 16 lae in grootte, 'n taak wat scipy. ndimage. filters. convolve is redelik stadig by. Let daarop dat ek is op soek na 8-buurman konneksie, dit is 'n 3x3 filter neem die gemiddelde van 9 pixels (8 regoor die brandpunt pixel) en ken wat waarde tot die pixel in die nuwe beeld. EDIT Verduideliking oor hoe ek sien dit werk: gebruik stridetricks om 'n skikking soos 0,1,2,1,2,3,2,3,4 genereer. wat ooreenstem met die boonste ry van die filter kern. Roll langs die vertikale as die middelste ry van die kern 10,11,12,11,12,13,13,14,15 kry. en voeg dit by die skikking Ek het in 1) Herhaal die onderste ry van die kern 20,21,22,21,22,23,22,23,24 kry. . Op hierdie punt, ek neem die som van elke ry en deel dit deur die aantal elemente in die filter, gee my die gemiddelde vir elke pixel, (skuif 1 ry en 1 Kol, en met 'n paar eienaardighede rondom kante, maar ek kan sorg dat later). Wat ek het gehoop vir 'n beter gebruik van stridetricks om die 9 waardes of die som van die kern elemente direk te kry, want die hele skikking, of dat iemand kan my oortuig van 'n ander meer doeltreffende metode. gevra 8 Februarie 11 van die 18:05 Want wat die moeite werd, Heres hoe youd doen dit met behulp van fancy Lopende truuks. Ek is van plan om dit gister plaas, maar het afgelei deur werklike werk. ) Paul amp eet albei mooi implementering met behulp van verskeie ander maniere om dit te doen. Net om dinge voort uit die vorige vraag, ek het gedink id post die N-dimensionele ekwivalent. Julle gaan nie in staat wees om aansienlik te klop scipy. ndimage funksies vir 1D skikkings egter. (Scipy. ndimage. uniformfilter moet scipy. ndimage. convolve al klop.) Verder, as jy probeer om 'n multi-dimensionele bewegende venster te kry, jy die risiko om geheue gebruik blaas wanneer jy per ongeluk 'n afskrif van jou reeks te maak. Terwyl die aanvanklike rollende skikking is net 'n blik op die geheue van jou oorspronklike skikking, sal enige intermediêre stappe wat die skikking kopieer 'n afskrif wat ordes groter as die oorspronklike skikking te maak (dit wil sê Kom ons sê dat jy werk met 'n 100x100 oorspronklike skikking . die siening daarin (vir 'n filter grootte van (3,3)) sal wees 98x98x3x3 maar gebruik dieselfde geheue as die oorspronklike. dit sal egter geen kopieë van die hoeveelheid geheue Eintlik gebruik dat 'n volledige 98x98x3x3 verskeidenheid sou), die gebruik van Crazy kruizen truuks is ideaal vir wanneer jy wil Vectorize beweeg venster beheer oor 'n enkele as van 'n ndarray. Dit maak dit baie maklik om dinge te bereken soos 'n bewegende standaardafwyking, ens met baie min oorhoofse. As jy wil om te begin om dit te doen saam verskeie byle, die moontlike, maar jy gewoonlik beter daaraan toe met meer gespesialiseerde funksies. (. Soos scipy. ndimage ens) In elk geval, hier is hoe jy dit doen: So, wat ons kry wanneer ons dit doen b rollingwindow (a, filtsize) is 'n 8x8x3x3 skikking, dis eintlik 'n blik op dieselfde geheue as die oorspronklike 10x10 skikking. Ons kon net so maklik gebruik verskillende filter grootte langs verskillende asse of bedryf net langs gekies asse van 'n N-dimensionele skikking (dws filtsize (0,3,0,3) op 'n 4-dimensionele skikking vir ons 'n 6-dimensionele siening sou gee ). Ons kan dan 'n arbitrêre funksie is van toepassing op die laaste as herhaaldelik om effektief te bereken dinge in 'n bewegende venster. Maar omdat tydelike skikkings wat baie groter as ons oorspronklike skikking op elke stap van die gemiddelde (of std of wat ook al) is is die stoor, dit is glad nie geheue doeltreffend Dit is ook nie van plan verskriklik vinnig te wees, óf. Die ekwivalent vir ndimage is net: Dit sal 'n verskeidenheid van randvoorwaardes te hanteer, doen die vervaag in-plek sonder dat 'n tydelike kopie van die skikking, en baie vinnig. Kruizen truuks is 'n goeie manier om 'n funksie is van toepassing op 'n bewegende venster langs een as, maar hulle is nie 'n goeie manier om dit te doen saam verskeie byle gewoonlik. Net my 0,02, in elk geval. Baie goed gestel: Kruizen truuks is 'n goeie manier om 'n funksie is van toepassing op 'n bewegende venster langs een as, maar they39re nie 'n goeie manier om dit te doen saam verskeie byle gewoonlik. En natuurlik jou verduideliking van die geheue 39blow up39 is belangrike een. Soort opsomming van jou antwoord (ten minste vir my) is: 39don39t te ver gaan visvang, die quarenteed vangs is nou al in scipy39. Dankie uitvoering eet 9 Februarie 11 van die 16:37 Dankie, Joe, vir hierdie antwoord. In rollingwindow moet die as nie hasattr (.): Terugkeer rollingwindowlastaxis eerder as rollingwindow (.). â € unutbu 12 Februarie 11 van die 16:47 Ek is nie genoeg vertroud is met Python uitskryf kode vir dit nie, maar die twee beste maniere om te bespoedig konvolusie is om óf afsonderlike die filter of gebruik die Fourier-transform. Geskei filter. Konvolusie is O (MK), waar M en N is aantal pixels in die beeld en die filter, onderskeidelik. Sedert gemiddelde filter met 'n 3-deur-3 kern is gelykstaande aan die eerste met 'n 3-deur-1 kern en dan 'n 1-vir-3 kern filter, kan jy (33) / (33) 30 spoed verbetering deur opeenvolgende konvolusie met twee 1-D pitte (dit natuurlik raak beter as die kern groter word). Jy kan nog steeds in staat wees om tred truuks hier gebruik, natuurlik. Fourier-transform. conv (A, B) is gelykstaande aan ifft (FFT (A) FFT (B)). maw 'n konvolusie in direkte ruimte word 'n vermenigvuldiging in Fourier ruimte, waar A jou beeld en B is jou filter. Sedert die (element-wyse) vermeerdering van die Fourier-transforms vereis dat A en B is dieselfde grootte, B is 'n verskeidenheid van grootte (A) met jou kern by die middelpunt van die beeld en nulle oral anders. Om 'n 3-deur-3 kern in die middel van 'n verskeidenheid plaas, moet jy dalk pad A tot vreemde grootte. Afhangende van jou implementering van die Fourier-transform, kan dit 'n baie vinniger as die konvolusie wees (en as jy dieselfde filter verskeie kere aansoek doen, kan jy vooraf bereken FFT (B). Spaar nog 30 van berekening tyd). beantwoord 9 Februarie 11 van die 15:27 Want wat die moeite werd it39s, in Python, dit is geïmplementeer in scipy. ndimage. uniformfilter en scipy. signal. fftconvolve. onderskeidelik. â € Joe Kington 9 Februarie 11 van die 15:44 Jonas: Cool Die Seperated filter benadering werk mooi, as jy sê dit spaar meer tyd as die kern grootte toeneem. Vir 'n 5000x5000 skikking, op 'n 11x11 pitgrootte, kry ek 7.7s vir 2d konvolusie gebruik van ndimage. convolve, en 2.0s vir twee 1d konvolusie gebruik van ndimage. convolve1d. Vir jou tweede oplossing wat B uitvoering Benjamin 9 Februarie 11 by 16:02 Een ding wat ek is vol vertroue behoeftes bepaal moet word is jou siening verskeidenheid b. Dit het 'n paar items uit ongeallokeerde geheue, sodat jy kry ineenstort. Gegewe jou nuwe beskrywing van jou algoritme, die eerste ding wat vasstelling nodig het, is die feit dat jy lang treë buite die toekenning van 'n: Omdat Im nog nie heeltemal gryp die metode en dit lyk asof daar makliker maniere om die probleem op te los nie, Im net gaan hierdie hier sit wat net lyk asof die eenvoudige benadering. Die enigste vreemde werking is dat dit toe te ken en te vul B slegs een keer. Al die toevoeging, verdeeldheid en kruip het om ongeag gedoen. As jy doen 16 bands, nog net wat jy nodig het om B keer toeken as jou bedoeling is om 'n beeld te red. Selfs al is dit nie help, kan dit verduidelik waarom ek nie die probleem te verstaan, of ten minste dien as 'n maatstaf om die speedups van ander metodes tot tyd. Dit loop in 2.6 sekondes op my laptop op 'n 5k x 5k verskeidenheid van float64s, 0,5 waarvan die skepping van B beantwoord 8 Februarie 11 van die 19:31 Dit is nie so duidelik vorm jou vraag, maar ek neem aan noudat youll wil verbeter aansienlik hierdie soort gemiddelde. Nou, watter soort prestasie verbeterings wat jy sou eintlik verwag Update: In die eerste plek, 'n waarskuwing: die kode in sy huidige toestand nie behoorlik aan te pas by die kern vorm. Maar dis nie my grootste bekommernis nou (in elk geval die idee is daar nou al hoe om behoorlik te pas). Ek het nou net gekies die nuwe vorm van 'n 4D n intuïtief, vir my is dit regtig sin maak om te dink oor 'n 2D kern sentrum word gesentreer om elke rooster posisie van oorspronklike 2D A. Maar dit 4D vorming kan nie eintlik die beste een. Ek dink die werklike probleem hier is die prestasie van optel. Een moet in staat wees om die beste orde (van die 4D a) Vind inorde jou masjiene kas argitektuur ten volle te benut. Maar daardie volgorde mag nie dieselfde vir klein skikkings watter soort wees werk saam met jou masjiene kas en diegene groter kinders, wat Dont (ten minste nie so eenvoudige manier). Werk 2: Hier is 'n effens aangepaste weergawe van MF. Dit is duidelik dat dit beter is om te hervorm tot 'n 3D verskeidenheid eerste en dan in plaas van optel, net doen puntproduk (dit het die voordeel al so, dat kern kan willekeurig wees). Maar dit is nog steeds 'n paar 3x stadiger (op my rekenaar) as Pauls opgedateer funksie. beantwoord 8 Februarie 11 van die 19: 33The volgende voorbeelde gee 'n bewegende gemiddelde van die vorige VENSTER waardes. Ons afgestomp die eerste (VENSTER -1) waardes, aangesien ons die gemiddelde can8217t vind voor hulle uit. (Die verstek gedrag vir konvolusie is om te aanvaar dat waardes voor die aanvang van ons ry is 0). (Meer formeel, bou ons die volgorde y vir die volgorde x waar yi (xi x (i1) 8230. x (in)) / N) Dit maak gebruik van numpy8217s konvolusie funksie. Dit is 'n algemene doel bewegende gemiddelde operasie. Die verandering van gewigte maak 'n paar waardes belangriker verrekening toepaslik kan jy gemiddeld beskou as om punt eerder as voorheen punt. Eerder as om truncating waardes kan ons die aanvanklike waardes in plek te los, soos geïllustreer in die voorbeeld: Soos hierdie: Verwante Post navigasie Laat 'n antwoord Kanselleer antwoord Dankie vir die tip, ek het gevind dat dit nuttig Jy het 'n effense probleem in jou vaste aanvanklike waarde voorbeeld : 8220extendeddata8221 moet die een wat gekonvuleerde, nie 8220data8221. Dankie vir die spot wat I8217ve gewysig die voorbeeld. Nice punt, dankie. Ek het geweet daar moes 'n optimale manier vir Numpy te rol gemiddeldes bereken word. Van die dokumente (docs. scipy. org/doc/numpy/reference/generated/numpy. convolve), dit lyk asof jou resep nog meer bondige deur gebruik te maak van die mode8221valid8221 navraag in plaas van sny kan wees: gtgtgt VENSTER 10 gtgtgt data 1,2 , 3,4,5,5,5,5,5,5,5,5,5,5,5 gtgtgt gewigte numpy. repeat (1.0, venster) / venster gtgtgt numpy. convolve (data, gewigte) VENSTER-1 :-( VENSTER-1) opgestel (4. 4.4, 4.7, 4.9, 5. 5.) gtgtgt numpy. convolve (data, gewigte, 8216valid8217) array (4. 4.4, 4.7, 4.9, 5. 5.) Ek het lees op baie plekke dat Moving mediaan is 'n bietjie beter as Moving gemiddelde vir 'n paar programme, want dit is minder sensitief vir uitskieters. Ek wou hierdie stelling op werklike data te toets, maar ek is nie in staat om hierdie effek te sien (groen: mediaan, rooi: gemiddelde). Sien hier: Ek het probeer met verskillende waardes vir venster breedte (hier in die kode 1000.), En dit was altyd dieselfde: die bewegende gemiddelde is nie beter as bewegende gemiddelde (maw nie minder sensitief vir uitskieters). Dieselfde met Venster breedte 10000 (10000 die piek breedte). Vraag: Kan jy 'n voorbeeld wat toon dat die verskuiwing mediaan is minder sensitief vir uitskieters as bewegende gemiddelde en indien moontlik die gebruik van die monster WAV-lêer-datastel (download link). maw is dit moontlik om 'n bewegende mediaan doen oor hierdie data sodanig dat die resultaat is soos volg geel kurwe (dit wil sê nie meer piek) Dit isnt regtig 'n antwoord, maar ek het gedink id verslag wat Im sien en vra vir meer inligting. Ive gelaai jou test. wav lêer en ek kan sien die sein geplot hieronder. So, wat jy kry in die erwe te wys jy is nie soseer die mediaanwaarde, maar is meer soos 'n koevert van die sein. Die tweede probleem is dat die sein eintlik lyk om deel van die sein wees. As ek zoom in die skans dan is dit wat ek sien: Wat maak jy regtig probeer om Dankie vir die terugvoer te bereik. Hier is 'n paar R-kode wat die volgende doen: 'n massa die wav lêer. Neem die absolute waarde van die sein (sy gelaai in die linker kanaal deur die wankel biblioteek). Voer 'n 100-lengte bewegende gemiddelde filter op die data om iets nader aan die koevert (rooi sein) kry. Dan volg 'n mediaan filter van lengtes 201, 2001 en 4001 tot die gevolg (blou sein). Kies uit die onderstaande plot, die beste presterende is die 4001 lengte een. Anders sal die uitwerking van die probleem is nog steeds teenwoordig. Die enigste ding wat ek kan verkeerd nou sien is dat die koevert nie die geval ooreenstem met die ware koevert asook id graag. 'N Beter kruinomhulseldetektor kan dit (bv die analitiese sein of so) te verbeter. Hier is 'n plot van die berekende-mediaan gefiltreer koevert oorgetrek op die oorspronklike sein. Dankie vir die tyd wat jy spandeer op hierdie vraag die waarheid te sê, ek geplot die mediaan en gemiddelde van die absolute waarde van die sein. En ja dit gee 'n idee van die koevert, dit is wat ek wil hê. Wat ek verwag (te danke aan mediaan in plaas van gemiddelde) was iets soos hierdie. kiekie. Ongelukkig ongeag die breedte venster vir die mediaan. die skerp styging is altyd hier. Terwyl baie dokument sê quotthe mediaan het die voordeel van die verlaging van die effek van uitskieters valuesquot. â € Basj 30 November 15 by 14:01 Goed, so die vraag I39m vra is: quotoutlier van whatquot. -) Met direkte mediaan of gemiddeld van die data wat jy het sal nonsens resultate oplewer. Mediaan filter werk net goed as 'n paar monsters (met betrekking tot die venster lengte) is buite die verwagte omvang. Omdat die data jy swaai positiewe en negatiewe, die mediaan isn39t regtig geskik is vir dit. Die neem van die mediaan van die koevert moet beter werk. Jy kan selfs 'n eenvoudige laaglaatfilter op die absolute waarde van 'n bestendiger koevert waarde kry. â € Peter K. 9830 30 November 15 by 14:05
No comments:
Post a Comment