Hoe het cumulatieve gemiddelde voor sommige getallen berekenen?

Aantal stemmen: 5

Ik zou graag willen weten hoe het cumulatieve gemiddelde voor sommige getallen moet worden berekend. Ik zal een eenvoudig voorbeeld geven om te beschrijven wat ik zoek.

Ik heb de volgende nummers

vec <- c (1, 2, 3, 4, 5)

als ik het gemiddelde van deze nummers doe, krijg ik er 3 als resultaat.

Nu, hoe het cumulatieve gemiddelde van deze nummers te doen.

aangepast op 26 juni '17 om 13:36 uur
Ronak Shah
vroeg Jun 17 '12 om 20:46
MR BIG

7 antwoorden

Aantal stemmen: 14

Naar analogie van de cumulatieve som van een lijst stel ik dit voor:Het cumulatieve gemiddelde avg van een vector X zou de gemiddelden van de 1e positie tot de positie bevatten ik.

Eén methode is alleen om het gemiddelde voor elke positie te berekenen door over alle vorige waarden te sommeren en te delen door hun aantal.

Door de definitie van het rekenkundig gemiddelde te herschrijven als een recursieve formule. Eén krijgt

avg (1) = x (1)

en

avg (i) = (i-1) / i * avg (i-1) + x (i) / i; (i> 1)

Het evalueren van deze uitdrukking voor elk element van uw vector (of lijst, eendimensionale array of hoe u dit ook noemt) geeft u het cumulatieve gemiddelde.

Deze recursieve methode is handig als je een gemiddelde over heel grote of heel veel gehele getallen moet berekenen en een overloop tegenkomt als je hun cumulatieve bedrag zou moeten opslaan.

Voorbeeld

In jouw voorbeeld

1, 2, 3, 4, 5

we krijgen

1, 1.5, 2, 2.5, 3
bewerkt op 29 juli '13 om 8:28
beantwoord op 26 jul 13 om 13:33 uur
Marius

Aantal stemmen: 7

Bewaar gewoon een lopende som van de getallen en een lopende telling ervan.Het gemiddelde is slechts de som over de telling.

beantwoord op 17 juni '12 om 20:48 uur
Mike Dunlavey

Aantal stemmen: 6

Vraag hoe u een cumulatief gemiddelde in R kunt creëren?ans:Dit antwoord werd gegeven door Jim Holtman jholtman@gmail.comHij gebruikt de cumSum () functie en de seq_along () functie dus lees daar meer over. Maar de verstrekte code maakt het duidelijk. 6, 6 + 16, 6 + 16 + 8, enzovoort

 x <- sample (1:20) X # [1] 6 16 8 1 17 11 2 19 18 5 15 13 3 20 9 14 7 10 12 4 cumsum (x) / seq_along (x) # [1] 6.000000 11.000000 10.000000 7.750000 9.600000 9.833333 8.714286 # 10.000000 10.888889 10.300000 # [11] 10.727273 10.916667 10.307692 11.000000 10.866667 11.062500 10.823529 # 10.777778 10.842105 10.500000
beantwoord op 8 augustus '14 om 19:35 uur
dxander

Aantal stemmen: 4

De vraag duidt op een ernstig gebrek aan onderzoek, maar ik heb nog niet genoeg reputatie om de vraag te beantwoorden. Als ik de vraag goed begrijp, is het gewenst cumulatief voortschrijdend gemiddelde.

Wikipedia beschrijft het cumulatieve voortschrijdend gemiddelde heel duidelijk. Ik mag hier geen afbeelding plaatsen, maar volg die link voor een eenvoudige formule (een gewogen gemiddelde van het vorige gemiddelde en de nieuwe waarde).

antwoordde 13 december '12 om 14:57
Jam560

Aantal stemmen: 1

Dit is een oude vraag en sindsdien zijn er veel veranderingen geweest. Ik dacht eraan om het te updaten met een dplyr antwoord. dplyr heeft een cummean functie die direct het cumulatieve gemiddelde van de vector geeft.

vec <- c (1, 2, 3, 4, 5)library (dplyr)cummean (vec)# [1] 1.0 1.5 2.0 2.5 3.0
beantwoord op 26 juni '17 om 13:34 uur
Ronak Shah

Aantal stemmen: 0

myNum [1] 1 2 3 4 5

cumsum (mynum) / seq (van = 1, tot = 5)

[1] 1.0 1.5 2.0 2.5 3.0

beantwoord op 22 maart 16 om 14:00 uur
Odysseus Ithaca

Aantal stemmen: 0

Ik heb een eenvoudige C ++ -klasse gemaakt.

# include <iostream>namespace std; gebruiken;class Average {openbaar: Gemiddeld (const dubbele initVal = 0.0) {accumVal = initVal;} double getAverage (const double newVal) { accumVal + = newVal; return accumVal / ++ numAccumVal; } void clear (const double clearedVal = 0.0) { accumVal = clearedVal; numAccumVal = 0; }privaat: dubbele accumVal; unsigned int numAccumVal = 0;};int main (int argc, const char * argv []) { Gemiddelde gem; for (size_t i = 1; i <= 5; ++ i) {// feed in 1 tot 5 dubbel resultaat = avg.getAverage (i); cout << "Resultaat:" << resultaat << endl; // druk het resultaat af } retourneer 0;}

En als u de code uitvoert, krijgt u het resultaat zoals hieronder.

Resultaat: 1Resultaat: 1,5Resultaat: 2Resultaat: 2,5Resultaat: 3Programma beëindigd met afsluitcode: 0
beantwoord op 10 juli '17 om 12:56 uur
Zack Lee