Monday, 9 October 2017

Moving Average Nan


numpy. 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 ek probeer om die bewegende gemiddelde te bereken in 'n groot Numpy skikking wat Nans bevat. Tans gebruik ek: By die berekening van 'n gemaskerde verskeidenheid: Die resultaat Ek is op soek na (hieronder) moet verkieslik het Nans net op die plek waar die oorspronklike skikking, x, het Nans en die gemiddelde gedoen moet word oor die aantal nie - NaN elemente in die groepering (Ek moet een of ander manier om die grootte van n in die funksie verander.) Ek kon loop oor die hele skikking en kyk indeks deur die indeks, maar die skikking ek gebruik is baie groot en dit sal 'n lang tyd in beslag neem. Is daar 'n numpythonic manier om dit te doen gevra 4 uur agoIn einde 'n asymptotical prestasie van O (n) te bereik (soos die-hand-gekodeerde oplossing nie), kan jy die totale funksie gebruik soos in die opgehoopte waarde (geïmplementeer as 'n anonieme tipe) bevat twee velde: resultaat bevat die resultaat lys opbou tot dusver. Working bevat die laaste periode-1 elemente. Die totale funksie voeg die huidige waarde van die Working lys, bou die huidige gemiddelde en voeg dit om die resultaat en dan verwyder die eerste (maw oudste) waarde van die werking lys. Die saad (dit wil sê die begin waarde vir die opeenhoping) is gebou deur die plaas van die eerste periode-1 elemente in 'n werkende en inisialisering Resultaat om 'n leë lys. Gevolglik tha samevoeging begin met element tydperk (draai (tydperk-1) elemente aan die begin) In funksionele programmering dit is 'n tipiese gebruik patroon vir die aggretate (of vou) funksie, btw. Die oplossing is nie funksioneel skoon deurdat dieselfde lys voorwerpe (Working en gevolg) is weer gebruik in elke stap. Ek is nie seker of dit kan veroorsaak probleme as 'n toekomstige opstellers probeer om die totale funksie outomaties parallellize (aan die ander kant Im ook nie seker nie, as dis moontlik na al.). 'N suiwer funksionele oplossing moet nuwe lyste te skep by elke stap. Let ook daarop dat C ontbreek kragtige lys uitdrukkings. In sommige hipotetiese Python-C-gemengde pseudokode kan 'n mens die samevoeging funksie soos wat 'n bietjie meer elegant in my beskeie mening sou wees skryf :) Let op die looptyd van O (N2). omdat jy nodig het om meer en meer elemente by elke stap oor te slaan (en AFAIK Skip (i) moet IEnumerator. MoveNext Ek keer noem). Sien my antwoord vir 'n oplossing in O (n) tyd. (Ek het net opgemerk die operational kommentaar hieronder dat hy / sy sal moontlik kry die waardes van 'n SQL databasis in die toekoms. In hierdie geval sou ek elke sterk ontmoedig om hierdie oplossing) uitvoering maak MartinStettner 3 Maart 11 by 00:53 Om dit te doen in 'n meer funksionele manier, youd moet 'n skandering metode wat bestaan ​​in Rx maar nie in LINQ. Kom ons kyk hoe dit sou lyk indien wed 'n scan metode En hier is die scan metode, geneem en aangepas uit hier: Dit moet beter prestasie as die brute krag metode het sedert ons met behulp van 'n lopende totaal van die SMA bereken. Om mee te begin, moet ons die eerste tydperk wat ons nageslag noem hier te bereken. Dan, elke daaropvolgende waarde wat ons kan bereken uit die opgehoopte saad waarde. Om dit te doen wat ons die ou waarde moet (dit wil sê T-delta) en die nuutste waarde waarvoor ons rits saam die reeks, een keer van die begin af en keer verskuif deur die delta. Aan die einde het ons 'n paar opruim deur die byvoeging van nulle vir die lengte van die eerste periode en die toevoeging van die aanvanklike saad waarde. antwoord 19 Junie 13 aan 22:58 Vir die mees doeltreffende manier moontlik om 'n bewegende gemiddelde met LINQ bereken, jy behoort LINQ gebruik in plaas ek stel voor die skep van 'n helper klas wat 'n bewegende gemiddelde bere in die mees doeltreffende manier moontlik (met behulp van 'n omsendbrief buffer en oorsaaklike bewegende gemiddelde filter), dan 'n uitbreiding metode om dit toeganklik te maak vir LINQ maak. Eerste aan die beurt, die bewegende gemiddelde Hierdie klas bied 'n baie vinnige en liggewig implementering van 'n MovingAverage filter. Dit skep 'n omsendbrief buffer van lengte n en bere een by te voeg, een aftrek en een vermeerder volgens datum-punt bygevoeg, in teenstelling met die N vermenigvuldig-voeg per punt vir die brute implementering van krag. Bogenoemde uitbreiding metodes draai die MovingAverage klas en laat voeg in 'n IEnumerable stream. Intro Een van die belangrikste programme vir die Arduino raad is om te lees en aan te meld van sensor data. Byvoorbeeld een monitors druk elke sekonde van die dag. So hoog monster pryse genereer dikwels spykers in die grafieke een wil ook 'n gemiddeld van die metings het. As die afmetings is nie staties in die tyd wat ons dikwels nodig is 'n lopende gemiddelde. Dit is die gemiddeld van 'n sekere tydperk en baie waardevol wanneer jy tendens analise. Eenvoudigste vorm van 'n lopende gemiddelde kan gedoen word deur kode wat voortbou op die vorige hardloop gemiddelde: As 'n mens nie die geval is wil gebruik drywende punt wiskunde - want dit neem geheue en verminder spoed - 'n mens kan dieselfde heeltemal te doen in die heelgetal domein. Die afdeling deur 256 in die voorbeeld kode is 'n verskuiwing regs 8, wat is vinniger as sê afdeling deur bv 100. Dit is waar vir elke krag van 2 as deler en een net sorg die som van die weigths is gelyk aan die krag van 2. En natuurlik moet 'n mens versigtig wees daar geen intermediêre oorloop (oorweeg die gebruik van unsigned long) As jy moet neem 'n meer akkurate loop gemiddeld in concreto van die laaste 10 metings, 'n skikking (of gekoppel lys) om hulle te hou nodig. Dit verskeidenheid dien as 'n omsendbrief buffer en met elke nuwe meting die oudste een is verwyder. Die lopende gemiddeld word bereken as die som van al die elemente verdeel deur die aantal elemente in die skikking. Die kode vir die lopende gemiddeld sal so iets wees: nadeel van hierdie kode is dat die skikking te alle waardes hou nogal groot kan word. As jy 'n meting per sekonde en jy wil 'n lopende gemiddelde per minuut jy 'n verskeidenheid van 60 moet 'n gemiddelde per uur sou 'n verskeidenheid van 3600. Dit kon nie op hierdie manier op 'n Arduino gedoen want dit het net 2K RAM nodig. Maar met die bou van 'n 2 stadium gemiddelde dit kan baie goed benader word (disclaimer: nie vir alle metings). In psuedo kode: As 'n nuwe interne statiese skikking is wat nodig is vir elke runningAverage funksie, hierdie skree as 'n klas te implementeer. RunningAverage biblioteek Die runningAverage biblioteek maak 'n klas van die funksie hierbo sodat dit meer as een keer gebruik kan word in 'n skets. Dit ontkoppelt dié byvoeging () en die gemiddelde () funksie gee om 'n bietjie meer buigsaam bv wees 'n mens kan die gemiddelde verskeie kere bel sonder toevoeging van 'n ding. Let asseblief daarop dat elke geval van die klas voeg sy eie reeks om metings te hou, en dat dit bydra tot die geheue gebruik. Die koppelvlak van die klas is so klein as moontlik gehou word. Let wel: met weergawe 0.2 die name van die metodes is almal gemaak meer beskrywende. Gebruik 'n klein skets toon hoe dit gebruik kan word. 'N ewekansige kragopwekker gebruik word om 'n sensor naboots. In die opstel van () die Myra is skoongemaak sodat ons kan begin toevoeging van nuwe data. In lus () eers 'n ewekansige getal gegenereer en omgeskakel word na 'n float toe te voeg aan Myra. Toe die runningAverage gedruk om die reeksnommer poort. 'N Mens kan ook vertoon dit op 'n paar LCD of stuur oor Ethernet ens Wanneer 300 items bygevoeg Myra is skoongemaak weer begin. Aantekeninge by die biblioteek te gebruik, maak 'n gids in jou SKETCHBOOKPATHlibaries met die naam RunningAverage en sit die. H en Cpp daar. Opsioneel 'n voorbeelde subgids om die monster app te plaas. Geskiedenis 2011/01/30: aanvanklike weergawe 2011/02/28: Vaste ontbreek destructor in. H lêer 2011/02/28: verwyder verstek konstruktor 2012--. trimValue () Yuval Naveh bygevoeg trimValue (gevind op web) 2012/11/21: refactored 2012/12/30: gevoeg fillValue () refactored vir die publikasie van 2014/07/03: gevoeg geheue beskerming kode - as interne skikking nie kan toegeken word grootte word 0. Dit is om probleem hier beskryf los - forum. arduino. cc/indextopic50473.msg1790086msg1790086 - Todo toets op groot skaal. Sjabloon klas RunningAverage. H RunningAverage. cppThis funksie is eksperimentele en kan verander word of heeltemal verwyder in 'n toekomstige vrystelling. Gegewe 'n geordende reeks data, sal die bewegende gemiddelde samevoeging n venster in die data skuif en stoot die gemiddelde waarde van die venster. Byvoorbeeld, gegewe die data 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Ons kan 'n eenvoudige bewegende gemiddelde met vensters grootte van 5 soos volg bereken: bewegende gemiddeldes is 'n eenvoudige metode om opeenvolgende glad data. Bewegende gemiddeldes is tipies aangewend om tydgebaseerde data, soos aandele pryse of bediener statistieke. Die smoothing kan gebruik word om 'n hoë frekwensie skommelinge of ewekansige geraas, wat toelaat dat die laer frekwensie tendense makliker om gevisualiseer, soos seisoenaliteit te skakel. Syntaxedit Linearedit Die lineêre model ken 'n lineêre gewig punte in die reeks, soos wat ouer datapunte (bv diegene wat aan die begin van die venster) 'n lineêr minder bedrag bydra tot die totale gemiddelde. Die lineêre gewig help verminder die lag agter die data in beteken, aangesien ouer punte minder invloed. 'N Lineêre model het geen spesiale instellings in te stel soos die eenvoudige model, kan venster grootte van die gedrag van die bewegende gemiddelde verander. Byvoorbeeld, 'n klein venster (window: 10) sal nou hou die data en net glad kleinskaalse skommelinge: Figuur 3. Lineêre bewegende gemiddelde met venster van grootte 10 In teenstelling hiermee het 'n liniêre bewegende gemiddelde met groter venster (window: 100) sal glad al hoër-frekwensie skommelinge, sodat net 'n lae-frekwensie, langtermyn tendense. Dit is ook geneig om agter die werklike data deur 'n aansienlike bedrag, alhoewel tipies minder as die eenvoudige model: Figuur 4. Lineêre bewegende gemiddelde met venster van grootte 100 Multiplikatiewe Holt-Wintersedit Multiplikatiewe gespesifiseer deur die oprigting type: mult. Hierdie verskeidenheid is verkies as die seisoenale invloed vermenigvuldig teen jou data. Bv As die seisoenale invloed is X5 die data, eerder as om net dit uit te brei. Die verstek waardes van alfa en gamma is 0,3 terwyl beta is 0.1. Die instellings aanvaar geen float 0-1 ingesluit. Die standaard waarde van tydperk is 1. Die vermenigvuldiging Holt-Winters model kan beperk Multiplikatiewe Holt-Winters werk word deur elke datapunt deur die seisoenale waarde. Dit is problematies as enige van jou data is nul, of indien daar gapings in die data (aangesien dit lei tot 'n divid-vir-nul). Om dit te bekamp, ​​die mult Holt-Winters pads alle waardes deur 'n baie klein hoeveelheid (110 -10) sodat alle waardes is nie-nul. Dit raak die resultaat, maar slegs minimaal. As jou data is nie-nul, of jy verkies om NaN sien wanneer nulle ondervind, kan jy dit gedrag met pad versper: valse Predictionedit Al die bewegende gemiddelde model ondersteun 'n voorspelling af, wat sal probeer om te ekstrapoleer na die toekoms, gegewe die huidige stryk, bewegende gemiddelde. Afhangende van die model en parameter, hierdie voorspellings mag of nie mag nie akkuraat wees. Voorspellings in staat gestel word deur die byvoeging van 'n voorspel parameter om enige bewegende gemiddelde samevoeging, spesifiseer die aantal voorspellings wat jy wil bygevoeg aan die einde van die reeks. Hierdie voorspellings word gespasieer uit op dieselfde interval as jou emmers: Die eenvoudige. lineêre en ewma modelle al produseer plat voorspellings: hulle wese konvergeer op die gemiddelde van die laaste waarde in die reeks, die vervaardiging van 'n plat: Figuur 11. Eenvoudige bewegende gemiddelde met venster van grootte 10, voorspel 50 In teenstelling, kan die Holt model ekstrapoleer gebaseer op plaaslike of globale konstante neigings. As ons 'n hoë beta waarde stel, kan ons ekstrapoleer gebaseer op plaaslike konstante tendense (in hierdie geval die voorspellings kop af, want die data aan die einde van die reeks was op pad in 'n afwaartse rigting): Figuur 12. Holt-Linear bewegende gemiddelde met venster van grootte 100, voorspel 20, Alpha 0.5, beta 0,8 In teenstelling, as ons kies 'n klein beta. die voorspellings is gebaseer op die globale konstante tendens. In hierdie reeks, die wêreldwye tendens is effens positief, sodat die voorspelling maak 'n skerp U-draai en begin 'n positiewe helling: Figuur 13. Double Eksponensiële bewegende gemiddelde met venster van grootte 100, voorspel 20, Alpha 0.5, beta 0,1 Die holtwinters model het die potensiaal om die beste voorspellings te lewer, aangesien dit ook inkorporeer seisoenale skommelinge in die model: Figuur 14. Holt-Winters bewegende gemiddelde met venster van grootte 120, voorspel 25, Alpha 0.8, beta 0,2, gamma 0.7, tydperk 30

No comments:

Post a Comment