公式
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
式(2)の第二項、間違ってませんか?
返信削除(sqsum - n * avg * avg) / (n - 1)
という式になるのでは?(キャストは省略)