Saturday 23 September 2017

Beräkna Simple Glidande Medelvärde Java


Din inre för är iterating all array så det är därför du alltid får samma medelvärde (den för hela arrayen), du bör iterera från 0 till nuvarande antal av yttre för istället. Ditt rörliga medelvärde uppdateras baserat på j i ditt inre för att det innebär att det kommer att åsidosätta tidigare värden varje ny slinga, det borde vara inuti det yttre i stället för det inre som använder jag som index. Du delar upp sumj för att beräkna medelvärden, varje ny inre loop du delar med 0 första summan. Jag tror att du menade att du använder j1 istället, indexet är inte detsamma som nuvarande längd. Tips för felsökning: Undvik att använda variabler i loop-arrays, du borde använda array. length istället. För att reproducera din fråga kan du ge oss det isolerade problemet istället för din nuvarande kod. dvs: Tänk om felet är i dina ingångar, hur kan vi tro att du verkligen använde dem svarade 4 okt 13 kl 20:54 Du slår över alla data varje gång. Du borde ha (int j (igång Längd-medellängd2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (eller något liknande) för ditt innersta genomsnitt. Dessutom bör movingAverageisumj modifieras för att hantera fallet när j är 0. Speciellt borde det förmodligen vara movingAverageisumverageLength och det ska appliceras på movingAveragei-slitsen utanför medelvärdesslingan. svarat 4 okt 13 kl 20:42 Nästa gång, ta kommentarer om uppdraget ur frågan innan du lägger in det. Men eftersom du verkar ganska ny på det här, tänk på hur du skulle gå igenom data och gör det så. Du bör försöka se till att varje slinga stannar vid rätt punkt och kom ihåg att om du skulle sluta när det inte finns några fler tal (som när du gör innerbandet och du kan bara få 3 fler siffror istället för 4) programmet måste sluta också. Se till att din kod söker efter det här. svarat 4 okt 13 kl 20:56 Utan ytterligare detaljer behöver du nog en obetydlig glidande medelvärde. Vid vilken som helst punkt Ai i ingångsuppsättningen A med längd N (med 0ltiltN), är det helt enkelt medelvärdet av de tidigare K-posterna i matrisen, upp till och inklusive Ai. Om det finns sådana värden, så genomsnittliga (i1) värdena från A0 till Ai. inclusive. En liten tanke kommer att visa dig att du inte behöver lägga till alla K-värden varje gång. Håll bara summan och när du flyttar till nästa punkt (det här är ett glidande medelvärde), dras det värde som ersätts och lägg till det nya värdet som ersätter det. (Under de första K-1-punkterna lägger du helt enkelt till det nya värdet till summan och ökar din räknare med 1.) Vid varje punkt i denna process är det glidande medelvärdet det aktuella summan dividerat med det aktuella räknarvärdet. svarat 4 okt 13 kl 21:05 I ett glidande medelvärde måste du ha någon form av fönsterstorlek. Din fönsterstorlek är genomsnittlig Längd, så det kommer att se ut så här: For loop startar med nuvarande data och går tillbaka med genomsnittlängds datapunkter och lägger till dem. Du kommer bara ha ett glidande medelvärde när du har när du har tillräckligt med datapunkter och medelvärdet blir summan dividerad med medellängden. Obs! Inte testad bara sudokod, men det här är idén. svarat 4 okt 13 kl 21:05 Ditt svar 2017 Stack Exchange, IncJava glidande medel Metod Om du letar efter en EMA som är optimerad för strömmande data, som kommer från en fil eller citat, kommer följande provklass du att göra bra, som motsats till användning av brute-force beräkningar. Detta tillvägagångssätt är särskilt användbart om du behandlar data i realtid. EMAs, ett speciellt fall av viktade glidmedel, har fördelen att relativ viktning för varje successiv period minskar med en konstant faktor f 2 (N1), där N är antalet perioder över vilka EMA ska appliceras. Med tanke på det kan du beräkna den aktuella EMA (dvs. för den aktuella perioden) med följande iterativa formel: eman fprice (1-f) eman-1 Följande provklass implementerar denna iterativa karaktär av EMA och minimerar beräkningskraven över brute - kraftmetoder eller efterbehandlingsmetoder. privata int NumPeriods 0 Private Int TotalPeriods 0 Private Double RunEMA 0,0 Private Double Factor 0.0 Public EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 (numPeriods 1.0) Återställ beräkningar för att generera EMA för den angivna perioden. public void reset (int numPeriods) Returnerar EMA för perioden definieras under konstruktorn. Om bearbetade perioder är mindre än EMA-området returneras noll. offentlig dubbelkalkylera (dubbelpris) runningEMA faktorprice (1-faktor) runningEMA om (totalPeriods lt numPeriods) Från var du källar prisdata och vad du gör med EMA-resultaten är upp till dig. Om du till exempel hade prisdata i en array och vill beräkna en EMA i en annan array, fungerar följande kod: dubbla priser. hämtas från beräkningar, fil eller citerar service dubbel ema ny doubleprices. length EMA ema ny EMA (50) 50 period EMA för (int idx0 iltprices. length idx) emaidx ema (pricesidx) Lycka till och bästa önskningar för ditt projekt. Cloudera Engineering Blog Enkel rörlig genomsnitts, sekundär sortering och MapReduce (del 3) Detta är den sista delen till en tredelad bloggserie. Om du vill se de föregående delarna i denna serie, använd följande länk: Tidigare förklarade jag hur du använder Excel och R som analysverktygen för att beräkna det enkla rörliga genomsnittet av en liten uppsättning av stängningskurser. I det här sista stycket till den tre delbloggserien ska jag gräva in med MapReduce för att hitta Enkelt rörande medelvärde för vår lilla provdataset. Sedan kommer jag att visa dig hur du använder samma kod, du kommer att kunna beräkna det enkla rörliga genomsnittet för varje slutligt aktiekurs sedan 1980. Ner kaninhålet med Hadoop I ovanstående exempel tog vi en titt på att beräkna det enkla glidande medeltalet av en relativt liten mängd data. För mycket analys, Excel och R är mycket effektiva verktyg, men när vi skala mot gigabyte, terabyte och petabyte data butiker vi stöter på några problem med datalägenhet, skivhastigheter och bearbetningshastigheter. För att illustrera dessa faktorer kan vi ta en mytisk maskin som hade en enda 1 petabyte disk, som fungerade på samma sätt som diskhastigheter idag. Använd i detta exempel en läshastighet på 40 MB. Låt oss säga att det är vårt jobb att skanna igenom dessa data och producera ett enkelt glidande medelvärde, förhindrar processorn inte beräkningen, och vi kan behålla ett rörligt fönsterberäkning genom data vid hela 40 MB. Låt oss också anta att uppgifterna tidigare sorterades och att vi bara var tvungna att utföra en sekventiell skanning, detta maximerar dataöverföringshastigheten från skivan och det kan konsekvent leverera 40 MB till bearbetningsrörledningen. Baserat på Jeff Deans 12 Numbers Varje ingenjör borde veta att detta är en trovärdig inställning. Vid denna genomströmning skulle vår enkla glidande genomsnittliga beräkning av 1 petabyte data ta cirka 310 dagar att slutföra. För de flesta situationer gör den här operativa kostnaden, i form av tid, det orimligt att överväga. Lyckligtvis minskar mekanikerna i HDFS och MapReduce dessa faktorer så att vi kan göra detta problem till en linjär tid och kapitalfunktion för att hjälpa oss att bestämma antalet maskiner vi vill genomföra för att effektivt genomföra denna enkla, glidande genomsökning. I ovanstående enkla glidande genomsnittliga exempel försummade vi inte att överväga begränsningarna att: lagra petabyte av data på icke-mytisk hårdvara. Sortera databasdatabasen. Med tanke på maskinvarufel under 310 dagars bearbetningstid. Typiskt måste tidsserieapplikationer skanna data vid någon tidpunkt, vilket skapar stora berg att klättra om vi vill närma oss stora tomter av tidsseriedata i dagens system. Upplevde flera terabyte och multi-petabyte datakällor i tidsserien domän varje dag, inklusive och i vart och ett av dessa domäner är ovanstående scenario en mycket riktig utmaning att hantera. HDFS löser lagrings - och felproblemen ovan, men vad gäller sorterings - och bearbetningsproblemen. Att sortera stora mängder data i sig är ett icke-trivialt problem, men kan nås med några knep i MapReduce. Låt oss titta på den verkliga MapReduce-koden som vi kan ladda ner för att kompilera och producera vårt eget skalbara enkla glidande medelvärde för att lösa några av dessa smärtpunkter. Enkelt rörligt medelvärde i MapReduce Vanligen består en MapReduce-applikation av två funktioner: (du gissade det) en kartfunktion och en reduceringsfunktion. I världen av Java-programmering skapar vi en kartklass och en minskad klass, var och en med arvsmetoder som är användbar för deras respektfulla ändamål. Vi använder MapReduce programmeringsmodell eftersom den är byggd för att mildra samtidiga problem i våra algoritmer och vi får vår skalbar parallellitet relativt smärtfritt. Kartfunktionen kan innefatta kod som utför en par-värdeparring, men dess huvudsakliga logiska funktion är att gruppera data med nycklar. Ett mycket enkelt sätt att tänka på en kartfunktion är att tänka på det som en logisk projicering av data eller en grupp efter klausul. Reduktionsfunktionen används för att ta dessa grupper (enskilt) och driva en process över de värden som grupperas tillsammans. Vanliga funktioner för att minska funktionerna är: I vårt enkla rörliga genomsnittliga exempel arbetar vi inte specifikt per värde, och vi producerar inte ett aggregat över alla värden. Vår verksamhet i aggregat innebär att ett glidfönster, som utför sin verksamhet på en delmängd av data vid varje steg. Vi måste också överväga att punkterna i vår tidsseriedata inte är garanterade att komma fram till minskningen i ordning och behöver sorteras8211 i tidigare avsnitt. Detta beror på att med flera kartfunktioner som läser flera sektioner av källdata MapReduce lägger inte någon order på de nyckelvärdespar som är grupperade i standardpartitionen och sorteringsscheman. Det finns scenariot där vi har sorterat partitionerade data, men för det här exemplet skedde vi att ta itu med de mer otaliga tidsseriedata som finns i trädgården. Låt oss ta ett första pass på hur vi kan utforma detta MapReduce enkelt glidande genomsnittligt jobb. Vi vill gruppera alla ena lagerbestämda nära värden tillsammans så att vi kan tillämpa den enkla glidande genomsnittsoperationen över de sorterade tidsseriedata. Vi vill emittera varje tidsseriens nyckelvärdespar som är nyckel på en stock symbol för att gruppera dessa värden tillsammans. I reduktionsfasen kan vi köra en operation, här det enkla glidande medlet, över data. Eftersom data som sannolikt inte kommer fram till reduceraren i sorterad ordning måste vi sortera data innan vi kan beräkna det enkla glidande medlet. Ett vanligt sätt att sortera data är att ladda data till minne i en datastruktur som en heap, ungefär som hur det görs i ett normalt java-program. I så fall använder du Javas prioritetsklass för att sortera våra data. Vi måste också överväga hur mycket minne som används av inkommande tidsseriedata under sorteringen, eftersom det här är en begränsande faktor för hur mycket data vi kan sortera. I denna design måste vi ladda alla tidsseriedata innan vi kan börja bearbeta och om mängden data som ska sorteras överskrider den tillgängliga hålstorleken har vi ett problem. Ett exempel på detta genomförande är värd för github: För att köra den här koden på ditt eget Hadoop-kluster, ladda ner CDH från Cloudera och skapa ett pseudo-distribuerat kluster 8211 som är en enda nod av Hadoop. Pseudo-distribuerat läge är ett bra sätt att prova kod med Hadoop. Nästa nedladdning och kompilera den glidande medelkoden i en burk. För att ladda ner koden direkt från github (i skalet i MacOSX, ssh terminalfönster i Linux eller MINGW32 för win32) använder we8217ll kommandot: Vårt första pass är en anständig lösning, men begränsades av vårt Java Virtual Machine (JVM) barn heap storlek och vi tar tid att manuellt sortera data själva. Med några designändringar kan vi lösa båda dessa problem och utnyttja vissa inneboende egenskaper i MapReduce. Först vill vi titta på fallet att sortera data i minnet på varje reducer. För närvarande måste vi se till att vi aldrig skickar mer data till en enda reducerare än vad som passar i minnet. Det sätt som vi för närvarande kan kontrollera är att ge varje reducerbarn JVM mer heap andor för att ytterligare partitionera våra tidsseriedata i kartfasen. I det här fallet gifter du partitionen ytterligare med tiden, bryter vår data till mindre fönster i tid. I motsats till ytterligare partitionering av data är en annan inställning till denna fråga att tillåta Hadoop att sortera data för oss i vad som kallas MapReduces blandningsfas. Om data kommer till en reducerare redan i sorterad ordning kan vi sänka vårt minnesfotavtryck och minska antalet slingor genom data genom att bara titta på nästa N-prov för varje enkel glidande medelberäkning. Detta leder oss till den avgörande delen av denna artikel, som kallas shuffles sekundär sort mekaniker. Sortering är något vi kan låta Hadoop göra för oss och Hadoop har visat sig vara ganska bra på att sortera stora mängder data och vann Gray Sort-tävlingen 2008. När vi använder den sekundära sortmekanikern kan vi lösa både vår höga och sortera frågor ganska enkelt och effektivt. För att använda sekundär sortering i vår kod måste vi göra nyckeln till en sammansatt av den naturliga nyckeln och det naturliga värdet. Nedan i Figur 1 ser vi ett diagram över hur detta skulle se ut visuellt. Figur 1: Sammansatt nyckeldiagram Den sammansatta nyckeln ger Hadoop den information som behövs under blandningen för att utföra en sortering inte bara på 8220stocks symbolen8221 utan också på tidsstämpeln. Klassen som sorterar dessa kompositnycklar kallas nyckelkomparatorn eller här 8220CompositeKeyComparator8221. Nyckelkomparatorn bör beställa av kompositnyckeln, vilken är kombinationen av den naturliga nyckeln och det naturliga värdet. Vi kan se nedan i Figur 2 där en abstrakt version av sekundär sortering utförs på en sammansatt nyckel med 2 heltal. Figur 2: CompositeKeyComparator-sortering Kompositnycklar (tangenterna är heltal). I figur 3 nedan ser vi ett mer realistiskt exempel där we8217ve ändrade kompositnyckeln för att få en stock symbolsträng (K1) och en tidstämpel (K2, som visas som ett datum men i koden är en lång i ms). Diagrammet har sorterat KV-paren med både 8220K1: stock symbol8221 (naturnyckel) och 8220K2: tidsstämpel8221 (sekundär nyckel). Figur 3: CompositeKeyComparator på jobbet på våra kompositnycklar. Kompositnyckel nu representerad med en stränglagersymbol (K1) och ett datum (K2). När we8217ve sorterade vår data på kompositnyckeln måste vi nu partitionera data för reduktionsfasen. I figur 4 nedan ser vi hur data från Figur 3 ovan har delats upp med NaturalKeyPartitioner. Figur 4: Partitionering med den naturliga nyckeln med NaturalKeyPartitioner. När we8217ve partitionerade våra data reducerare kan nu börja ladda ner partitionsfilerna och börja fusionsfasen. Inf Figur 5 nedan ser vi hur gruppkomparatorn, eller NaturalKeyGroupingComparator, används för att se till att ett reducera () - samtal endast ser den logiskt grupperade data som är avsedd för den sammansatta nyckeln. Figur 5: Grupperingskompatator sammanslagning av partitionsfiler. Partitioner - och gruppkomparatorn för kompositnyckeln bör endast överväga den naturliga nyckeln för partitionering och gruppering. Nedan är en kort beskrivning av Simple Moving Average-koden som ändras för att använda sekundär sorteringen och är värd för github. Om du märker, matchar namnen på klasserna nära terminologin som används i diagrammen ovan och i Tom Whites Hadoop: Den slutgiltiga guiden (kapitel 8 MapReduce-funktioner) för att göra koden lättare att förstå. NaturalKey 8211 vad du normalt skulle använda som nyckel eller grupp av operatör. I det här fallet är den naturliga nyckeln grupp - eller aktiesymbolen eftersom vi behöver gruppera potentiellt osorterade lagerdata innan vi kan sortera det och beräkna det enkla glidande medlet. Composite Key 8211 En nyckel som är en kombination av den naturliga nyckeln och det naturliga värdet vi vill sortera efter. 5 svar på ldquo Enkelt flyttande medelvärde, sekundär sortering och MapReduce (del 3) rdquo Coolt knep med split sorteringspartitionern. Såvitt jag kan säga fungerar det bra tills serierna blir extremt långa (tänk 30 år med fältnivådata) 8211 verkar som att partitionering med tiden kan vara mycket knepig. Känner du till allt som är inbyggt i hadoop som en 8220överlappande partitioner8221 som kan spotta samma data till flera partitioner jag har experimenterat med mappers som duplicerar värden på flera tangenter, men jag undrar om there8217s är en mer konventionell sätt att göra detta. Evan, Du är död med storleken på data i en enda nyckeltal. Jag slår samma fråga när jag arbetar på openPDC-projektet för NERC: En sensor kan ha bokstavligen miljarder poäng på mycket kort tid, så för prototypjobb har vi nyckelat saker till en enda dag (3.600.000ms): I en mer komplex version Jag skulle ha använt överlappande tidsluckor så att mappen skulle få tillräckligt med data från intilliggande tangentbord för att täcka en enda fönsterlängd. För närvarande säger I8217d att du är på rätt väg med dubbla värden. Jag vet att detta inte är relaterat till glidande medelvärden, men hur exakt var SAX-tidsserien matchning som användes i PDC jag implementerade något så här (förutom att använda MapReduce API 2) och i loop of reducera () - funktionen, när. nästa () - metoden kallas på Iterator, vi får ett nytt värde, men nyckeln ändras också mirakulöst. Snarare ändras den del av kompositnyckeln som inte användes som en naturlig nyckel (tidsstämpeln i det här exemplet). Det var ganska överraskande. Hur händer detta Postnavigering Anta Apache Hadoop i FörbundsregeringenAnsattaSimple glidande medelvärdenSimma glidande medelvärde Du uppmanas att lösa denna uppgift enligt uppgiftsbeskrivningen, med vilket språk du kanske känner. Beräknar det enkla glidande medlet av en serie siffror. Skapa en stateful funktionsklassinstans som tar en period och returnerar en rutin som tar ett tal som argument och returnerar ett enkelt glidande medelvärde av dess argument hittills. Ett enkelt glidande medelvärde är en metod för att beräkna ett medelvärde av en ström av siffror genom att endast beräkna de senaste 160 P 160-talen från strömmen, 160 var 160 P 160 är känd som perioden. Det kan genomföras genom att anropa en initialiseringsrutin med 160 P 160 som sitt argument 160 I (P), 160, som sedan ska returnera en rutin som, när den kallas med enskilda successiva medlemmar i en ström av tal, beräknar medelvärdet av (upp till), de senaste 160 P 160 av dem, kan ringa denna 160 SMA (). Ordet 160 stateful 160 i uppgiftsbeskrivningen hänvisar till behovet av 160 SMA () 160 för att komma ihåg viss information mellan samtal till den: 160 Perioden, 160 P 160 En beställd behållare med minst de senaste 160 P 160 numren från var och en av dess enskilda samtal. Stateful 160 betyder också att successiva samtal till 160 I (), 160 initialiseraren, 160 bör returnera separata rutiner som gör 160 inte 160 delade sparade tillstånd så att de kunde användas på två oberoende dataströmmar. Pseudokod för en implementering av 160 SMA 160 är: Denna version använder en bestående kö för att hålla de senaste p-värdena. Varje funktion som returneras från init-moving-genomsnittet har sitt tillstånd i en atom som håller ett kövärde. Denna implementering använder en cirkellista för att lagra siffrorna i fönstret i början av varje iterationspekare hänvisar till listcellen som håller värdet bara förflyttning ur fönstret och att ersättas med det tillförda värdet. Använda en avslutningsredigering För närvarande kan denna sma vara nogc eftersom den allokerar en stängning på högen. Några flyktanalyser kunde ta bort heapfördelningen. Använda en strukturredigering Den här versionen undviker hällanslutningen av stängningen och håller data i stapelramen för huvudfunktionen. Samma utmatning: För att undvika att de flytande punktens approximationer fortsätter att växa upp och växer, kan koden utföra en periodisk summa på hela cirkulärkön. Denna implementering producerar två (funktion) objekt delningstillstånd. Det är idiomatiskt i E att separera inmatning från utgång (läs från skriv) istället för att kombinera dem i ett objekt. Strukturen är densamma som implementeringen av Standard DeviationE. Elixirprogrammet nedan genererar en anonym funktion med en inbäddad period p, som används som perioden för det enkla glidande medlet. Körningsfunktionen läser numerisk ingång och skickar den till den nyupprettade anonyma funktionen och inspekterar sedan resultatet till STDOUT. Utgången visas nedan, med medelvärdet, följt av den grupperade ingången, som utgör grunden för varje glidande medelvärde. Erlang har stängningar, men oföränderliga variabler. En lösning är då att använda processer och ett enkelt meddelande som passerar baserat API. Matrisspråken har rutiner för att beräkna glidningsavvikelserna för en given sekvens av objekt. Det är mindre effektivt att slinga som i följande kommandon. Ständigt uppmanar till en ingång I. som läggs till i slutet av en lista L1. L1 kan hittas genom att trycka på 2ND1, och medel kan hittas i ListOPS Tryck på ON för att avsluta programmet. Funktion som returnerar en lista som innehåller medelvärdet för det medföljande argumentet Program som returnerar ett enkelt värde vid varje tillkännagivande: Listan är listan som medelvärde: p är perioden: 5 returnerar den genomsnittliga listan: Exempel 2: Använda programmet movinav2 , 5) - Initialisering av glidande medelberäkning, och definiera en period på 5 movinav2 (3, x): x - nya data i listan (värde 3) och resultatet lagras på variabel x och visas movinav2 (4, x) : x - ny data (värde 4), och det nya resultatet lagras på variabel x och visas (43) 2. Beskrivning av funktionen movinavg: variabel r - är resultatet (den genomsnittliga listan) som kommer att returneras variabel i - är indexvariabeln, och den pekar på slutet av dellistan som listan är medeltal. Variabel z - en hjälparvariabel Funktionen använder variabel i för att bestämma vilka värden av listan som ska beaktas i nästa genomsnittliga beräkning. Vid varje iteration pekar variabel I till det sista värdet i listan som kommer att användas i medelberäkningen. Så vi behöver bara ta reda på vilka som kommer att vara det första värdet i listan. Vanligtvis måste man överväga p-element, så det första elementet kommer att vara det som indexeras av (i-p1). Men vid de första iterationerna kommer denna beräkning normalt att vara negativ, så kommer följande ekvation att undvika negativa index: max (i-p1,1) eller, ordna ekvationen, max (i-p, 0) 1. Men antalet element på de första iterationerna kommer också att vara mindre, det korrekta värdet kommer att vara (slutindex - startindex 1) eller, ordna ekvationen, (i - (max (ip, 0) 1) 1) och sedan , (I-max (ip, 0)). Variabel z har det gemensamma värdet (max (ip), 0) så startindex kommer att vara (z1) och nummervärdena blir (iz) mitt (lista, z1, iz) kommer att returnera listan över värde som kommer att vara medelvärde ( .) summerar dem summa (.) (iz) ri kommer att genomsöka dem och lagra resultatet på lämpligt ställe i resultatlistan fp1 skapar en partiell applikation som fastställer (i detta fall) andra och tredje parametrar

No comments:

Post a Comment