確率統計確率統計
ディリクレ分布サンプリング; Dirichlet Distribution Sampling

概要
\(K-1\)次ディリクレ分布は以下の式で表現される確率分布。ここで\(\boldsymbol{\alpha}\)は形状パラメータである。ベータ分布を多変量に拡張した分布である。

$$f(\boldsymbol{x})=\frac{\Gamma \left(\sum_{i=1}^{K} \alpha_i \right)}{\prod_{i=1}^{K} \Gamma(\alpha_i)} \displaystyle \prod_{i=1}^{K} x_i^{\alpha_i - 1} $$
ディリクレ分布111
ディリクレ分布222

ディリクレ分布123
ディリクレ分布322

ディリクレ分布に従う確率変数の生成はベータ分布と同様に、形状パラメータ\(\kappa=\alpha_i \)、尺度パラメータ\(\theta=1\)の\(K\)個のガンマ分布に従う確率変数を\(R_i\)としたとき、\(\boldsymbol{x} = (\frac{R_1}{\sum R_i}, \ldots, \frac{R_{K-1}}{\sum R_i})^T\)がディリクレ分布に従うことを利用する。

ソースコード

namespace ExRandom.MultiVariate {
    public class DirichletRandom : Random<double> {
        readonly int dim;
        readonly Continuous.GammaRandom[] gr_list;

        public DirichletRandom(MT19937 mt, params double[] alpha_list) {
            if(mt == null) {
                throw new ArgumentNullException();
            }

            if(alpha_list == null || alpha_list.Length <= 1) {
                throw new ArgumentException();
            }

            this.dim = alpha_list.Length;

            this.gr_list = new Continuous.GammaRandom[dim];

            for(int i = 0; i < dim; i++) {
                this.gr_list[i] = new Continuous.GammaRandom(mt, kappa:alpha_list[i], theta:1);
            }
        }

        public override Vector<double> Next() {
            double r_sum = 0;
            double[] r_list = new double[dim];
            Vector<double> v = new Vector<double>(new double[dim - 1]);

            for(int i = 0; i < dim; i++) {
                r_list[i] = gr_list[i].Next();
                r_sum += r_list[i];
            }

            r_sum = Math.Max(r_sum, double.Epsilon);

            for(int i = 0; i < dim - 1; i++) {
                v[i] = r_list[i] / r_sum;
            }

            return v;
        }
    }
}

関連項目
メルセンヌ・ツイスタ
各種確率分布サンプリング基本クラス
ガンマ分布サンプリング
ベータ分布サンプリング

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類