web-dev-qa-db-ja.com

累積平均(平均)を計算する

いくつかの数値の累積平均を計算する方法を知りたいのですが。私が探しているものを説明する簡単な例を示します。

私は次の番号を持っています

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

これらの数値の平均をとると、結果として3になります。

さて、これらの数の累積平均を行う方法。

8
MR BIG

リストの累積合計と同様に、私はこれを提案します。ベクトルxの累積平均avgには、からの平均が含まれます。位置iまでの最初の位置。

1つの方法は、以前のすべての値を合計し、それらの数で割ることによって、各位置の平均を計算することです。

算術平均 の定義を再帰式として書き直すことによって。 1つは

avg(1) = x(1)

そして

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

ベクトルのすべての要素(またはリスト、1次元配列、またはどのように呼んでも)についてこの式を評価すると、累積平均が得られます。

この再帰的な方法は、非常に大きい整数または非常に多くの整数の平均を計算する必要があり、それらの累積合計を格納する必要がある場合にオーバーフローが発生する場合に便利です。

あなたの例では

1, 2, 3, 4, 5

我々が得る

1, 1.5, 2, 2.5, 3
16
Marius

Rで累積平均を作成する方法について質問しますか?回答:この回答はJim [email protected]によって提供されました。彼はcumsum()関数とseq_along()関数を使用しているので、それらをよく読んでください。しかし、提供されたコードはそれを明確にしています。 6、6 + 16、6 + 16 +8など

   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
8
dxander

数の現在の合計とそれらの現在の数を保持するだけです。平均は、カウント全体の合計です。

7
Mike Dunlavey

これは古い質問であり、それ以来多くの変更がありました。 dplyrの答えで更新することを考えました。 dplyrにはcummean関数があり、ベクトルの累積平均を直接与えます。

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

#[1] 1.0 1.5 2.0 2.5 3.0
5
Ronak Shah

質問は研究の深刻な欠如を示していますが、私はまだ質問を投票するのに十分な評判を持っていません。私が質問を正しく理解している場合、望ましいのは累積移動平均です。

Wikipedia 累積移動平均を非常に明確に説明しています。ここに画像を投稿することは許可されていませんが、そのリンクをたどって簡単な式(以前の平均と新しい値の加重平均)を確認してください。

4
Jam560

mynum [1] 1 2 3 4 5

cumsum(mynum)/ seq(from = 1、to = 5)

[1] 1.0 1.5 2.0 2.5 3.0

0
Odysseus Ithaca

単純なC++クラスを作成しました。

#include <iostream>

using namespace std;

class Average {

public:
    Average(const double 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;
    }
private:
    double accumVal;
    unsigned int numAccumVal=0;
};

int main(int argc, const char * argv[]) {

    Average avg;

    for (size_t i=1; i<=5; ++i) { //feed in 1 to 5

        double result = avg.getAverage(i);
        cout << "Result : " << result << endl; //print the result
    }
    return 0;
}

そして、コードを実行すると、次のような結果が得られます。

Result : 1
Result : 1.5
Result : 2
Result : 2.5
Result : 3
Program ended with exit code: 0
0
Zack Lee