Saturday 30 September 2017

Enkel Glidande Medelvärde Implementering


Jag vet att detta kan uppnås med boost enligt: ​​Men jag vill verkligen undvika att använda boost. Jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 siffrorna som ett dataprov. Vad är det enklaste sättet att uppnå detta jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. Frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt, du gör en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med ackumulatorn med det nya värdet. Du väljer en konstant alfa som ligger mellan 0 och 1 och beräknar det här: Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prover. Hmm, jag är inte säker på att det här passar dig, nu när jag har lagt den här. Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. Svarade 12 jun 12 kl 4:44 1 på ditt inlägg. Det exponentiella glidande medlet kan tillåta att alfabetet är variabelt. Så det här låter det användas för att beräkna tidbasvärdena (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alfa vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 numren som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs till, vilket undviker kostnadskrävande O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. Använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt, eftersom numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool data medlem för att spela in när behållaren fylls första gången medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 kl 5:19 antar man att kvoträttsoperatören (T-prov) citationstecken är faktiskt quotvoid operatorltlt (T-prov) citat. Ndash oPless 8 juni 14 kl 11:52 oPless ahhh. Välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kan du använda vilken anteckning du helst tyckte. Kommer att fixa, tack. ndash Tony D Jun 8 14 14:27Simple Moving Average - SMA BREAKING DOWN Enkelt rörligt medelvärde - SMA Ett enkelt glidande medelvärde är anpassningsbart genom att det kan beräknas för ett annat antal tidsperioder, helt enkelt genom att lägga till slutkursen för säkerheten för ett antal tidsperioder och sedan dela denna summa med antalet tidsperioder, vilket ger det genomsnittliga priset på säkerheten över tidsperioden. Ett enkelt glidande medel ökar volatiliteten och gör det enklare att se prisutvecklingen för en säkerhet. Om det enkla rörliga genomsnittet pekar upp betyder det att säkerhetspriset ökar. Om det pekar ner betyder det att säkerhetspriset minskar. Ju längre tidsramen för det rörliga genomsnittet är, desto smidigare är det enkla glidande medlet. Ett kortare rörligt medelvärde är mer volatilt, men läsningen är närmare källdata. Analytisk betydelse Flyttande medelvärden är ett viktigt analysverktyg som används för att identifiera aktuella prisutvecklingar och potentialen för en förändring av en etablerad trend. Den enklaste formen av att använda ett enkelt glidande medel i analys använder det för att snabbt identifiera om en säkerhet är i en uptrend eller downtrend. Ett annat populärt, om än något mer komplext analysverktyg, är att jämföra ett par enkla glidande medelvärden med varje täckande olika tidsramar. Om ett kortfristigt enkelt glidande medelvärde överstiger ett långsiktigt genomsnitt, förväntas en uptrend. Å andra sidan signalerar ett långsiktigt medelvärde över ett kortare medelvärde en nedåtgående rörelse i trenden. Populära handelsmönster Två populära handelsmönster som använder enkla glidande medelvärden inkluderar dödskorset och ett gyllene kors. Ett dödskors inträffar när det 50-dagars enkla glidande medelvärdet passerar under 200-dagars glidande medelvärde. Detta betraktas som en baisse signal, att ytterligare förluster finns i butik. Det gyllene korset uppstår när ett kortsiktig glidande medel bryter över ett långsiktigt glidande medelvärde. Förstärkt av höga handelsvolymer kan detta signalera ytterligare vinster finns i butik. En enkel rörlig genomsnittsimplementering i Java Vid flera tillfällen ville Ive beräkna enkla mätvärden i mina Java-applikationer, till exempel antalet träffar per timme eller fel under en tid period. Medan det inte är väldigt svårt att beräkna enkla mätvärden, är det bara extra arbete och ID som helst spendera den tiden på problemdomänen. Jag blev förvånad över att inte hitta några allmänt accepterade lösningar för metrics i Java. Jag hittade Metrics men det verkade lite för komplicerat och inte väl dokumenterat - Allt jag verkligen ville var att beräkna ett glidande medelvärde. Jag tänkte på problemet lite mer och bestämde mig för att det inte var ett svårt problem. Heres min lösning Detta fungerar genom att skapa en rad fönster uppdateringsfrekvens storlek, sedan anger en tråd räkningen till nästa index i arrayen på uppdateringsfrekvensen. Räkningen för intervallet är helt enkelt arrayi-arrayi1, vilket är det senaste räkningen minus det äldsta räknat. I ett 10-minutersintervall är det äldsta talet (i1) exakt 10 minuter gammalt. För att lägga till ett glidande medelvärde till vår kod behöver du först en räknare med AtomicLong. Denna räknare bör ökas baserat på de händelser du är intresserad av att använda (t. ex. POST-förfrågningar om en REST-tjänst). Vi måste tillhandahålla implementeringen med tillgång till räknaren och det uppnås genom GetCount-gränssnittet. Här skapar jag ett glidande medelvärde med ett 5 minuters fönster som uppdateras varje sekund. Och för att få det nuvarande genomsnittet kallar vi bara getAverage-metoden: En viktig implementeringsdetalj är hur arraystorleken bestäms: genom att dividera fönstret med uppdateringsfrekvensen. Så ett stort fönster med en frekvent uppdateringsfrekvens kan förbruka en betydande mängd minne. I det här exemplet är arraystorleken rimlig 300. Om vi ​​skapade ett 24-timmars glidande medelvärde med ett intervall på 1 sekund skulle storleken vara 86400 En mer rimlig uppdateringsfrekvens under en 24-timmarsperiod kan vara var 5: e minut (arraystorlek 288 ). Ett annat övervägande att välja fönstret och uppdateringsfrekvensen är att fönstret måste vara delbart med frekvensen. Ett 2-minutersfönster med en 6 sekunders uppdateringsfrekvens är ok, men en 7 sekunders uppdateringsfrekvens är inte, eftersom den inte är delbar med 120. En olagligArgumentException kastas om fönstermodulens uppdateringsfrekvens inte är noll. Denna implementering kräver en tråd per glidande medelvärde, vilket inte är mycket effektivt. En bättre lösning skulle vara att dela en tråd över många medelvärden. Uppdatering . Ive uppdaterade koden för att dela en tråd här. Slutligen, theres ett initialt statligt problem: vi har inte data ännu för hela fönstret. Till exempel om du har ett 5 minuters fönster och bara 15 sekunder med data. Denna implementering returnerar null tills vi har 5 minuters data. Ett annat tillvägagångssätt är att uppskatta genomsnittet. Anta att vi har ett räkning på 10 på 30 sekunder, då kan vi uppskatta genomsnittet som 40 på 2 minuter. Det finns emellertid risk för signifikant fel genom att extrapolera ofullständiga data. Om vi ​​exempelvis hade en brast på 20 träffar på 2 sekunder, beräknar vi 1200 per 2 minuter, vilket med all sannolikhet är långt ifrån. I statistiken är ett enkelt glidande medelvärde en algoritm som beräknar det obegripade medelvärdet av de sista n-proverna . Parametern n kallas ofta fönsterstorleken, eftersom algoritmen kan ses som ett fönster som glider över datapunkterna. Genom att använda en rekursiv formulering av algoritmen reduceras antalet operationer som krävs per prov till en addition, en subtraktion och en division. Eftersom formuleringen är oberoende av fönsterstorleken n. runtime komplexiteten är O (1). d. v.s. konstant. Den rekursiva formeln för det obegripade rörliga genomsnittsvärdet är, där avg är det rullande medelvärdet och x representerar en datapunkt. Så, när fönstret glider åt höger, faller en datapunkt, svansen ut och en datapunkt, huvudet rör sig in. Implementering En implementering av det enkla glidande medlet måste ta hänsyn till följande Algoritminitialisering Så länge som Fönstret är inte fullt befolket med värden, den rekursiva formeln misslyckas. Lagring Tillgång till svanselementet krävs, vilket beroende på implementeringen kräver lagring av n-element. Min implementering använder den presenterade formeln när fönstret är helt befolket med värden och annars växlar till formeln, som uppdaterar medelvärdet genom att beräkna summan av de föregående elementen. Observera att detta kan leda till numeriska instabiliteter på grund av flytande punkträkning. När det gäller minneskonsumtion använder implementeringen iteratorer för att hålla reda på huvud och svanselement. Detta leder till en implementering med konstanta minneskrav oberoende av fönsterstorleken. Här är uppdateringsproceduren som glider fönstret till höger. I de flesta samlingarna ogiltigförklaras deras uppräknare när den underliggande samlingen är modifierad. Genomförandet är dock beroende av giltiga uppräknare. Speciellt i streamingbaserade applikationer behöver den underliggande samlingen ändras när ett nytt element kommer fram. Ett sätt att hantera det är att skapa en enkel cirkulär fixformatsamling av storlek n1 som aldrig ogiltigförklarar dess iteratorer och alternativt lägger till ett element och kallar Shift. Jag önskar att jag kunde ta reda på hur man faktiskt implementerar detta, eftersom testfunktionen är mycket förvirrande för mig8230 Behöver jag konvertera data till Array, kör sedan SMA sma ny SMA (20, array) för en 20-årig SMA Hur hanterar jag? shift () funktion Är det nödvändigt att implementera konstruktörer. (förlåt för förvirring). Nej, du don8217t behöver konvertera dina data till en array så länge som dina data implementerar IEnumerable1 och den uppräknade typen är dubbel. Vad beträffar din privata meddelandehantering måste du konvertera DataRow till något som är uppräkningsbart för dubbla värden. Din inställning fungerar. Skift, glider fönstret ett läge till vänster. För en dataset med säg 40 värden och en 20-årig SMA har du 21 positioner som fönstret passar in (40 8211 20 1). Varje gång du ringer Skift () flyttas fönstret till vänster av en position och Average () returnerar SMA för det aktuella fönstret. Det vill säga det obegripade genomsnittet av alla värden inuti fönstret. Dessutom tillåter min implementering att beräkna SMA även om fönstret inte är fullt fyllt i början. Så i huvudsak hoppas det här hjälper. Några ytterligare frågor COPYRIGHT MEDDELANDE Christoph Heindl och cheind. wordpress, 2009-2012. Otillåten användning och / eller duplicering av detta material utan uttryckligt och skriftligt tillstånd från denna blogg är författare andor ägare strängt förbjudet. Utdrag och länkar kan användas, förutsatt att fullständig och tydlig kredit ges till Christoph Heindl och cheind. wordpress med lämplig och specifik riktning till det ursprungliga innehållet. Nya Inlägg

No comments:

Post a Comment