中華料理店過程 (CRP: Chinese Restaurant Process) のJulia 1.0実装
観測データ$x_1,\cdots,x_N \sim \mathcal N(x; \mu, \Lambda^{-1})$について, クラスタ$s_1,\cdots,s_N \sim \mathrm{C}\mathrm{R}\mathrm{P} (\alpha)$を生成するプログラム.
観測データが中華料理店の客,クラスタ番号がテーブル番号に対応する.
Juliaは直感的に書けて中々楽しい.
using Distributions using Plots using LinearAlgebra function sample_CRP(X::Matrix{Float64}, alpha::Float64) N = size(X, 2) p = Vector{Float64}([alpha]) S = zeros(Int32, N) K = 0 for n in 1:N k = rand(Categorical(p / (n-1+alpha))) if k - 1 == K # 新しいクラスタが生成された insert!(p, K + 1, 1) K = K + 1 S[n] = K else # 既存のクラスタが生成された p[k] = p[k] + 1 S[n] = k end end # p = p / (N+alpha) return S end mu = zeros(Float64, 2) covmat = Diagonal{Float64}(I, 2) X = rand(MvNormal(mu, covmat), 1000) S = sample_CRP(X, 2.0) K = size(unique(S), 1) # クラスタ数 plt = histogram(S, bins=K) savefig(plt, "figure.png")
参考文献
わかりやすいパターン認識 続/石井健一郎/上田修功【合計3000円以上で送料無料】 価格:3,520円 |
ノンパラメトリックベイズ 点過程と統計的機械学習の数理 (機械学習プロフェッショナルシリーズ) [ 佐藤 一誠 ] 価格:3,080円 |