背景
最近はラオ・ブラックウェルの定理というものを勉強していました。これを用いると決定関数を改善出来る可能性があるということらしいです。字面を追っているだけだとよくわからないので、教科書に載っていない例を自分で数値実験してみることにしました。
ラオ・ブラックウェルの定理とは
ある決定関数$\delta(X)$があるとします。十分統計量$T$を考え、その条件付期待値により計算される$\delta^*(T)=E[\delta(X)|T]$を考えます。$T$に依存しますのでこれもまた統計量です。これについて
$$
E[(\delta^*(T)-\theta)^2]\leq E[(\delta(T)-\theta)^2]
$$
が成立します。これをラオ・ブラックウェルの定理といいます。これを用いて決定関数を改善するためには
- 決定関数と十分統計量を用意する
- 条件付期待値により統計量$\delta^*(T)$を作る
- 標本から$\delta^*(T)$の期待値を得る
という手順を踏めばOKです。
数値実験
条件付期待値を計算しなければならないので、以前計算した結果を利用するため、ポアソン分布からのサンプリングを考えます。標本サイズは$2$とします。改良前の決定関数としては$\delta(X)=X_0$を採用します。条件付期待値は
$$
\delta^*(t) = \sum_{x_0=0}^t x_0 p(x|T=t)=\sum_{x_0=0}^t p(x|t) =\sum_{x_0=0}^t x_0\times \frac{1}{x_0!(t-x_0)!}\frac{1}{\sum_{n=0}^t\frac{1}{n!(t-n)!}}
$$
となります(十分統計量の値をリサンプリングして母分布の概形を得るの計算結果を利用しました)。
これは明らかに$T$の関数であり、統計量となっています。改良どころか本当にこれで推定出来るんだろうか、不安になってきました・・・。
とにかくやってみます。$\lambda=5$とし、その推定を繰り返します。
#include <iostream>
#include <random>
#include <vector>
#include <fstream>
int factorial(int k)
{
int ret = 1;
for (int i=1; i<=k; i++)
{
ret *= i;
}
return ret;
}
int main(int argc, char **argv)
{
double lambda = 5;
std::mt19937 mt(atoi(argv[1]));
int Iter = 1000;
std::poisson_distribution<> poi(lambda);
double sum = 0;//改良後
double sum2 = 0;//改良前
for(int iter=0; iter<Iter; iter++)
{
double x0 = poi(mt);
double x1 = poi(mt);
double t = (x0+x1);
double num = 0, den = 0;
for(int n=0; n<=t; n++)
{
num += (double)n/factorial(n)/factorial(t-n);
den += 1./factorial(n)/factorial(t-n);
}
sum += num/den / (double)(Iter);
sum2 += x0 / (double)Iter;
}
std::cout << sum2 << " " << sum << std::endl;
return 0;
}
紫が改善前、緑が改善後です。改善後も$5$付近が中心となっており、ばらつきが小さくなっていることが確認できました。
まとめ
ラオ・ブラックウェルの定理により推定方法を改善出来ることが数値的に確認できました。