このページの解説は C99 をベースとしています。
以下は目次です。
要素が数値の配列があるとき、その偏差平方和を求めたいとします。
偏差平方和とは、各要素の値と、全体の平均値との差を二乗した値を合計したもののことです。
たとえば、配列の内容が {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) {
+= array[i];
result }
return result;
}
double average(const double* array, size_t size)
{
(size > 0);
assertreturn 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) {
+= (array[i] - avg) * (array[i] - avg);
result }
return result;
}
int main(void)
{
const double array[] = {5, 5, 2, 14, 4};
("%lf\n", sum_of_squares(array, SIZE_OF_ARRAY(array)));
printf}
実行結果:
86.000000
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |