偏差平方和を求める | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

要素が数値の配列があるとき、その偏差平方和を求めたいとします。

偏差平方和とは、各要素の値と、全体の平均値との差を二乗した値を合計したもののことです。
たとえば、配列の内容が {5, 5, 2, 14, 4} だとしましょう。 全体の平均値は (5 + 5 + 2 + 14 + 4)÷5 で 6 ですから、 各要素の値との差はそれぞれ、{1, 1, 4, 8, 2} になります。 この後、2乗するので、符号は気にする必要はありません(2乗するとつねに正の数になるので)。 それぞれ2乗すると、{1, 1, 16, 64, 4} となります。 この合計 86 が、偏差平方和になります。

なお、偏差平方和を要素の件数で割ると、分散という値になります。分散は、「逆引き 分散を求める」で扱っています。

方法①(計算式通りに求める)

冒頭の説明どおり、まず平均値を求めて、各要素との差の2乗を計算して、合計を出します。 平均値を求める方法は、「逆引き 平均値を求める」で取り上げているので、 そちらを参照してください。

冒頭の例は、整数で示しましたが、現実的には実数で扱うことが多いかもしれません。以下のサンプルプログラムは、double型で扱うようにしています。

#include <assert.h>
#include <stdio.h>

#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

double sum(const double* array, size_t size)
{
    double result = 0.0;

    for (size_t i = 0; i < size; ++i) {
        result += array[i];
    }
    return result;
}

double average(const double* array, size_t size)
{
    assert(size > 0);
    return sum(array, size) / size;
}

double sum_of_squares(const double* array, size_t size)
{
    double result = 0.0;

    // 平均値を求める
    double avg = average(array, size);

    // 各要素の値と平均値との差の2乗を合計する
    for (size_t i = 0; i < size; ++i) {
        result += (array[i] - avg) * (array[i] - avg);
    }

    return result;
}

int main(void)
{
    const double array[] = {5, 5, 2, 14, 4};

    printf("%lf\n", sum_of_squares(array, SIZE_OF_ARRAY(array)));
}

実行結果:

86.000000


参考リンク


更新履歴

’2017/6/8 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る