Friday 3 November 2017

Moving Gjennomsnittet Scipy


Hmmm, det virker som om dette er lett å implementere funksjonen er faktisk ganske enkelt å få feil og har fremmet en god diskusjon om minneeffektivitet. Jeg er glad for å ha oppblåst hvis det betyr å vite at noe er gjort riktig. Richard Sep 20 14 på 19 23.NumPy s mangel på en bestemt domenespesifikk funksjon er kanskje på grunn av Core Team s disiplin og troskap til NumPy s hoveddirektiv gi en N-dimensjonal array type samt funksjoner for å lage og indeksere disse arrays Like mange grunnleggende mål, denne er ikke liten, og NumPy gjør det glimrende. Den mye større SciPy inneholder en mye større samling av domenespesifikke biblioteker kalt subpackages av SciPy devs - for eksempel numerisk optimalisering optimalisere signal signalering og integral kalkulator integrere. Min gjetning er at funksjonen du er ute etter, er i minst en av SciPy-subpackagene kanskje, men jeg vil se først ut i samlingen av SciPy-scikits, identifisere de relevante scikitene og se etter Funksjonen av interesse there. Scikits er uavhengige utviklede pakker basert på NumPy SciPy og rettet mot en bestemt teknisk disiplin, for eksempel scikits-image scikits-learn osv. Flere av disse var spesielt den fantastiske OpenOpt for numerisk optimalisering var høyt ansett, modne prosjekter lange før du velger å bo under de relativt nye scikits rubricene The Scikits hjemmeside likte å overliste omtrent 30 slike scikits selv om minst flere av disse ikke lenger er under aktiv utvikling. Etter dette rådene vil du lede til scikits-timeseries, men den pakken er nei lengre under aktiv utvikling Pandas er faktisk blitt AFAIK, de facto NumPy-baserte tidsserienbiblioteket. Pandas har flere funksjoner som kan brukes til å beregne et bevegelige gjennomsnittsgrunnlag. Det enkleste av disse er trolig rollingmean som du bruker som så. Nå , bare ring funksjonen rollingmean passerer i Serie objektet og en vindu størrelse som i mitt eksempel nedenfor er 10 days. verify at det w orked - for eksempel sammenliknet verdier 10-15 i den opprinnelige serien versus den nye serien glattet med rullende middel. Funksjonen rullende men sammen med omtrent et dusin eller annen funksjon er informelt gruppert i Pandas dokumentasjonen under rubrikkens flyttingsvindu fungerer en sekund relatert gruppe av funksjoner i Pandas refereres til som eksponentielt vektede funksjoner, for eksempel ewma som beregner eksponentielt flytende vektet gjennomsnitt. Det faktum at denne andre gruppen ikke er inkludert i de første bevegelige vindusfunksjonene, er kanskje fordi de eksponentielt vektede transformasjonene ikke stole på en fast lengde window. answered Jan 14 13 på 6 38.Jeg vet at dette er et gammelt spørsmål, men her er en løsning som ikke bruker noen ekstra datastrukturer eller biblioteker. Det er lineært i antall elementer i inngangslisten og Jeg kan ikke tenke på noen annen måte å gjøre det mer effektivt, faktisk hvis noen vet om en bedre måte å tildele resultatet, vennligst gi meg beskjed. NB! Dette ville være mye raskere med en numpy arr ay i stedet for en liste, men jeg ønsket å eliminere alle avhengigheter. Det ville også være mulig å forbedre ytelsen ved multi-threaded execution. Funksjonen forutsetter at inntallelisten er endimensjonal, så vær forsiktig. UPD har blitt foreslått mer effektive løsninger ved Alleo og jasaarim. Du kan bruke for det. Modusargumentet angir hvordan du kan håndtere kantene jeg valgte den gyldige modusen her fordi jeg tror det er slik de fleste forventer å kjøre, betyr å jobbe, men du kan ha andre prioriteter. Her er et plot som illustrerer forskjellen mellom modusene. Ansatt Mar 24 14 kl 22 01. Jeg liker denne løsningen fordi den er ren en linje og relativt effektivt arbeid gjort i numpy Men Alleo s Effektiv løsning ved å ha bedre kompleksitet Ulrich Stern Sep 25 15 på 0 31. Du kan beregne et løpende gjennomsnitt med. Fortall inneholder numpy en convolve-funksjon som vi kan bruke for å øke hastigheten. Det løpende gjennomsnittet er ekvivalent med å inkludere x med en vektor som er N lang, med alle medlemmer lik 1 N Den numpy implementeringen av convolve inkluderer startovergangen, så du må fjerne de første N-1 poengene. På min maskin er den raske versjonen 20-30 ganger raskere, avhengig av lengden på inngangsvektoren og størrelsen på gjennomsnittsvinduet . Merk at convolve innebærer en samme modus som virker som om den burde adressere det begynnende forbigående problemet, men det splitter det mellom begynnelsen og slutten. Den fjerner forbigående fra slutten, og begynnelsen har ikke en Vel, jeg antar det Det er sans for prioriteringer, jeg trenger ikke det samme antall resultater på bekostning av å få en skråning mot null som ikke er der i dataene BTW, her er en kommando for å vise forskjellen mellom modusmodi full, samme, gyldig tomt convolve de 200,, de 50, 50, modus m for m i moduser akse -10, 251, - 1, 1 1 legemodus, lok lavere senter med pyplot og numpy importert lapis Mar 24 14 på 13 56.pandas er mer egnet for dette enn NumPy eller SciPy Dens funksjon rollingmean gjør jobben praktisk ly Det returnerer også et NumPy-array når inngangen er en array. Det er vanskelig å slå rollingmean i ytelse med en tilpasset ren Python-implementering. Her er et eksempel ytelse mot to av de foreslåtte løsningene. Det er også gode alternativer for hvordan man skal håndtere med kanten verdier. Jeg er alltid irritert av signalbehandling funksjon som returnerer utgangssignaler av forskjellig form enn inngangssignaler når både innganger og utganger er av samme natur, for eksempel begge tidssignaler. Det bryter korrespondansen med relatert uavhengig variabel, f. eks. tid, frekvens gjør plotting eller sammenligning ikke en direkte sak uansett, men hvis du deler følelsen, vil du kanskje endre de siste linjene i den foreslåtte funksjonen som samme retur. windowlen-1 - windowlen-1 Christian O Reilly aug 25 15 på 19 56.A litt sent til festen, men jeg har laget min egen lille funksjon som ikke vikler rundt endene eller pads med nuller som deretter brukes til å finne gjennomsnittet, så vel som en videre behandling er at den også re-sampler signalet på lineært avstandspunkter. Tilpass koden på vilkårlig måte for å få andre funksjoner. Metoden er en enkel matrisemultiplikasjon med en normalisert gausskjerne. En enkel bruk på et sinusformet signal med tilsatt normal distribuert støy. Dette spørsmålet er nå jevnt eldre enn når NeXuS skrev om det i forrige måned, men jeg liker hvordan koden hans håndterer kantsaker. Men fordi det er et enkelt bevegelig gjennomsnittsnivå, går det med resultater etter de dataene de søker. Jeg trodde det handlet om kantsaker i en mer tilfredsstillende måte enn NumPy s-modi som er gyldige samme og fulle, kan oppnås ved å anvende en lignende tilnærming til en konvoluttbasert metode. Mitt bidrag bruker et sentralt løpende gjennomsnitt for å justere resultatene med deres data. Når det er to få poeng tilgjengelig for full størrelse vinduet som skal brukes, blir løpende gjennomsnitt beregnet fra suksessivt mindre vinduer ved kantene av arrayet Egentlig fra suksessivt større vinduer, men det er en implementeringsdetalj. Det er relativt sakte fordi det bruker convolve og kan sannsynligvis bli spruced opp ganske mye av en ekte Pythonista, men jeg tror at ideen står. Ansatt Jan 2 på 0 28. Det er hyggelig, men sakte når vinduets bredde blir stor. Noen svar gir mer effektive algoritmer med, men synes ikke å håndtere kantsverdier, selv har jeg implementert en algoritme som kan håndtere dette problemet godt, hvis dette problemet er erklært som. Input parameter mergenum kan betraktes som 2 windowwidth 1. Jeg vet at denne koden er litt ulæselig hvis du finn det nyttig og vil ha noen utvidelser, vennligst gi meg beskjed, og jeg vil oppdatere dette svaret Siden skriving kan en forklaring koste meg mye tid, jeg håper jeg bare gjør det når noen trenger det. Vennligst tilgi meg for min latskap. Hvis bare du er interessert i sin opprinnelige versjon. Det er enda mer uleselig, den første løsningen blir kvitt kantenproblemet ved å putte nuller rundt arrayet, men den andre løsningen som er lagt ut her, håndterer den på en tøff og direkte måte. I min siste setning forsøkte jeg å indikere e hvorfor det hjelper flytende punktfeil Hvis to verdier er omtrent samme størrelsesorden, legger du til mindre presisjon enn hvis du la et veldig stort tall til en veldig liten kode. Koden kombinerer tilstøtende verdier på en måte som til og med mellomliggende beløp skal alltid være rimelig tett i størrelsesorden for å minimere flytpunktsfeilen. Ingenting er dumt bevis, men denne metoden har lagret et par svært dårlig implementerte prosjekter i produksjon. Mayur Patel 15. desember kl. 17 22. Alleo I stedet for å gjøre ett tillegg per verdi, vil du gjør det to. Beviset er det samme som bit-flipping problemet. Poenget med dette svaret er imidlertid ikke nødvendigvis ytelse, men presisjonsminnebruk for gjennomsnittlig 64-biters verdier vil ikke overstige 64 elementer i hurtigbufferen, så det er vennlig i minnebruk også Mayur Patel Des 29 14 på 17 04. Følgende eksempler gir et glidende gjennomsnitt av de foregående WINDOW-verdiene. Vi trunker de første WINDOW -1-verdiene, siden vi ikke kan finne gjennomsnittet før t hem Standardstandarden for konvolusjon er å anta at verdiene før starten av vår sekvens er 0 Mer formelt konstruerer vi sekvensen y for sekvensen x hvor yi xi xi 1 xin n. Dette benytter numpy s convolution-funksjonen Dette er en Generell bruk, glidende gjennomsnittlig drift. Ved å legge vektene, gjør noen verdier viktigere, motsetning på riktig måte, slik at du kan se gjennomsnittet som rundt punkt i stedet for før punkt. I stedet for avkortede verdier kan vi fikse de opprinnelige verdiene på plass, som illustrert i dette eksemplet.

No comments:

Post a Comment