2009年8月3日月曜日

不偏分散 (unbiased variance)

公式

C言語での実装

式(2) を実装。ほぼ分散と同じ。 ゼロ除算を防ぐために、nが2未満の場合は0を返すようにする。
#include <stdio.h>
#include <math.h>

/* ---------------------------------------------
  不偏分散を計算する
  引数1: a データ
  引数2: n aの要素数
  戻り値 不偏分散
 ---------------------------------------------*/
double unbiased_variance(double *a, int n)
{
    int i;
    double sum = 0.0;
    double sqsum = 0.0;
    double avg;

    if ( n < 2 ) return 0.0;

    for (i = 0; i < n; i++) {
        sum += a[i]; /* 和 */
        sqsum += a[i] * a[i]; /* 平方和 */
    }

    avg = sum / (double)n; /* 平均 */
    return sqsum / (double)(n - 1) - avg * avg; /* 不偏分散 */
}

/* main */
int main(void)
{
    double numbers[] = {1.0, 2.0, 3.0};
    double u;

    u = unbiased_variance(numbers, 3);
    printf("不偏分散:%f\n", u);

    return 0;
}
実行例
不偏分散:0.3000000

1 件のコメント:

  1. 式(2)の第二項、間違ってませんか?
    (sqsum - n * avg * avg) / (n - 1)
    という式になるのでは?(キャストは省略)

    返信削除