Friday 18 August 2017

Moving Genomsnittet Effektiv Implementering


Jag har i huvudsak en mängd värden som denna. Den ovanstående matrisen är översimplifierad, jag m samlar 1 värde per millisekund i min riktiga kod och jag måste bearbeta utmatningen på en algoritm som jag skrev för att hitta den närmaste toppen före en tidpunkt Logiken misslyckas eftersom i mitt exempel ovan är 0 36 den riktiga toppen, men min algoritm skulle se bakåt och se det sista numret 0 25 som toppen eftersom det sänker till 0 24 före det. Målet är att ta dessa värden Och tillämpa en algoritm för dem som släpper ut dem lite så att jag har mer linjära värden, dvs jag tycker att mina resultat är kurva, inte jaggedy. Jag har fått höra att använda ett exponentiellt glidande medelfilter till mina värden. Hur kan jag gör det här Det är verkligen svårt för mig att läsa matematiska ekvationer. Jag hanterar mycket bättre med kod. Hur bearbetar jag värden i min array och tillämpar en exponentiell glidande genomsnittlig beräkning för att till och med utföra dem. Skal den 8 februari 12 på 20 27. För att beräkna ett exponentiellt glidande medelvärde behöver du hålla någon stat runt och du behöver en inställningsparameter Detta kräver en liten klass om du antar att du använder Java 5 eller senare. Inställning med sönderfallsparametern du vill kan ta tuning ska vara mellan 0 och 1 och använd sedan genomsnittet för att filtrera. När du läser en sida på några matematiska Återkommande, allt du verkligen behöver veta när du gör det till kod är att matematiker gillar att skriva index i arrayer och sekvenser med prenumerationer. De har några andra noteringar också, vilket hjälper inte Emellertid är EMA ganska enkel eftersom du bara behöver att komma ihåg ett gammalt värde, inga komplicerade tillståndsuppställningar krävs. svarade den 8 februari 12 på 20 42. TKKocheran Ganska mycket Det är inte trevligt när saker kan vara enkla Om du börjar med en ny sekvens får du en ny medelvärde Observera att de första villkoren i Den genomsnittliga sekvensen hoppar runt lite på grund av gränseffekter, men du får de med andra glidande medelvärder. En bra fördel är dock att du kan linda den glidande genomsnittliga logiken in i medelvärdet och experimentera utan att störa t han vilar på ditt program för mycket Donal Fellows 9 februari 12 på 0 06. Jag har svårt att förstå dina frågor, men jag kommer att försöka svara ändå.1 Om din algoritm hittat 0 25 istället för 0 36, då är det fel Det är fel eftersom det förutsätter en monotonisk ökning eller minskning som alltid går upp eller alltid går ner, Om du inte vill ha det maximala, om du inte är genomsnittlig ALLA dina data, är dina datapunkter --- som du presenterar dem --- olinjära. värdet mellan två punkter i tid, skära sedan din matris från tmin till tmax och hitta max av den subarray.2 Nu är konceptet för glidande medelvärden mycket enkelt. Föreställ dig att jag har följande lista 1 4, 1 5, 1 4, 1 5, 1 5 Jag kan släpa ut det genom att ta medeltalet av två nummer 1 45, 1 45, 1 45, 1 5 Observera att det första numret är genomsnittet av 1 5 och 1 4 sekund och första siffrorna är den andra nya listan är genomsnittet av 1 4 och 1 5 tredje och andra gamla listan den tredje nya listan i genomsnitt 1 5 och 1 4 fjärde och tredje, och så vidare kunde jag har gjort det period tre eller fyra eller n Observera hur dataen är mycket jämnare Ett bra sätt att se glidande medelvärden på jobbet är att gå till Google Finance, välj ett lager försök Tesla Motors ganska flyktiga TSLA och klicka på technicals längst ner på diagrammet Välj Flyttande medelvärde med en given period och Exponentiell glidande medelvärde för att jämföra deras skillnader. Exponentialt glidande medelvärde är bara en annan utarbetande av detta men viktar de äldre data mindre än de nya data så är det ett sätt att förspänna utjämningen mot baksidan Vänligen läs Wikipedia-posten. Så det här är mer en kommentar än ett svar, men den lilla kommentarrutan var bara för liten lycka till. Om du har problem med matte kan du gå med ett enkelt glidande medel istället för exponentiella Så utgången du får skulle vara de sista x-termerna dividerad med x Otestad pseudokod. Notera att du måste hantera start - och slutdelarna av data eftersom det tydligt är att du inte kan räkna med de senaste 5 termerna när du befinner dig på din andra datapunkt , den re är effektivare sätt att beräkna denna rörliga genomsnittliga summan summan - äldsta nyaste, men det här är att få konceptet av vad som händer across. answered 8 februari 12 på 20 41.A Simple Moving Average Implementation i Java. Vid flera tillfällen har jag ville beräkna enkla mätvärden i mina Java-applikationer, till exempel antalet träffar per timme eller fel under en tidsperiod. Det är inte särskilt svårt att beräkna enkla mätvärden, men det är bara extra arbete och jag vill hellre 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 Det är inte ett svårt problem Här är min lösning. Detta fungerar genom att skapa en rad fönsteruppdateringsfrekvensstorlek, och en tråd anger räkningen till nästa index i matrisen på uppdateringsfrekvensen. Räkningen för intervallet är Helt enkelt array i-array i 1, vilket är det senaste räkningen minus det äldsta antalet. För ett 10-minutersintervall är det äldsta räknet i 1 exakt 10 minuter gammalt. För att lägga ett glidande medelvärde till vår kod först behöver vi en räknare, använder 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 en rörelse Genomsnittet med ett 5 minuters fönster som uppdateras varje sekund. För att få det aktuella genomsnittet kallar vi bara getAverage-metoden. En viktig implementeringsdetalj är hur arraystorleken bestäms genom att dela 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 reasonabl e-uppdateringsfrekvensen för en 24-timmarsperiod kan vara en 5-minuters arraystorlek på 288. En annan övervägning att välja fönstret och uppdateringsfrekvensen är att fönstret måste delas med frekvensen. Till exempel är ett 2-minuters fönster med en 6 sekunders uppdateringsfrekvens 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 medeltal Uppdatera Jag har uppdaterat koden för att dela en tråd här. Det finns ett första tillståndsproblem som vi inte har data för hela fönstret, till exempel om du har ett 5 minuters fönster och bara 15 sekunder Av data Denna implementering returnerar null tills vi har 5 minuters data En annan metod är att uppskatta genomsnittet. Antag att vi har ett räkning på 10 i 30 sekunder, då kan vi uppskatta genomsnittet som 40 på 2 minuter. Hur Det finns alltid risk för ett signifikant fel genom att extrapolera ofullständiga data. Om vi ​​hade en utbrott på 20 träffar på 2 sekunder, uppskattar vi 1200 per 2 minuter, vilket med all sannolikhet är långt ifrån. Jag vet att detta är möjligt med boost Som per. Men jag skulle verkligen vilja undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. Basiskt vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 numren som Ett dataprov. Vilket ä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 best. asked 12 juni 12 kl 4 38. Om dina behov är enkla kan du bara försöka använda ett exponentiellt rörligt medelvärde. Du gör bara en ackumulatorvariabel, och när din kod tittar på varje prov uppdaterar koden ackumulatorn med det nya värdet. Du väljer en konstant alfa den där Är mellan 0 och 1 och beräkna detta. Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det passar dig, nu när jag har Sätta det 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 en mindre Genomsnittet, som 30 nummer eller så, det här är ett mycket enkelt och snabbt sätt att göra it. answered 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så här låter det användas för att Beräkna tidsbasen medeltal, t. ex. bytes 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 alfa vara usecs sedan senaste uppdateringen 1000000 jxh jun 12 12 vid 6 21. Basiskt jag vill spåra det rörliga genomsnittet av en pågående ström av en ström av floati Ng punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, vilket undviker dyrt ON-traversal för att beräkna summan som behövs för genomsnittet - på begäran. Totalt görs en annan parameter Från T för att stödja t ex med lång längd när det är 1000 lång s, en int för char s eller en dubbel till total float s. Detta är lite fel i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en osignerad Länge länge eller använd en extra bool-data medlem för att spela in när behållaren fylls i första gången medan cykeltalsprover runt arrayen bäst sedan omdämnes något harmlöst som pos. answered 12/12 12 vid 5 19.one förutsätter att tomrumsoperatören T-provet är faktiskt tomt operatör T prov oPless 8 juni 14 på 11 52. oPless ahhh väl spotted egentligen menade jag att det skulle vara tomt operatör T prov men självklart kan du använda vilken anteckning du vill, kommer att fixa, tack Tony D Jun 8 14 på 14 27.

No comments:

Post a Comment