PyMC3を使って、変化点検出のベイズ推論を勉強しています。
ちなみに、参考にしているのは以下のサイトにある手順を完全にコピーし、データだけ変更しています。
https://qiita.com/hanon/items/467d27e077763bcadf2a
使っているデータは、以下の30個のデータになります。
318
318
318
731
747
685
595
617
608
585
2994
1746
1246
1115
1280
1294
1258
6058
3029
2240
2781
4539
9451
16317
32358
77360
100539
125762
144517
194145
234392
307486
今、以下のようにコードを実行しましたが、
描画されたデータで3点ほど、おかしな箇所があるので質問させていただきました。
python
1# ライブラリのインポート 2import pandas as pd 3import numpy as np 4import matplotlib.pyplot as plt 5import seaborn as sns 6from tqdm import tqdm 7import pymc3 as pm 8sns.set_style('darkgrid') 9pd.set_option('display.max_columns', None) 10pd.set_option('display.max_rows', 500) 11plt.rcParams['font.family'] = 'IPAPGothic' 12%matplotlib inline 13 14# データのインポート 15data = np.loadtxt('coronavils.txt') 16n_count = len(data) 17days = np.arange(n_count) 18 19# モデルの構築 20basic_model = pm.Model() 21 22with basic_model: 23 alpha = 1 / data.mean() 24 tau = pm.DiscreteUniform('tau', lower=0, upper=n_count) 25 26 lambda_1 = pm.Exponential('lambda_1', alpha) # 指数分布の期待値は1/lambdaとなる 27 lambda_2 = pm.Exponential('lambda_2', alpha) # lambdaの期待値はデータxの期待値なので、alphaは"1/データxの平均"となる 28 29 lambda_ = pm.math.switch(days < tau, lambda_1, lambda_2) # daysがtau未満:lambda_1, tau以上:lambda_2を返す関数、lambda_を定数として扱える 30 31 observation = pm.Poisson('observation', lambda_, observed=data) 32 33# 学習 34# 最初の10000回を捨て、40000回をサンプリング結果として使用する 35# chainは2本(デフォルト) 36with basic_model: 37 trace = pm.sample(40000, tune=10000) 38 39# 学習結果 40pm.traceplot(trace) 41 42# サンプリング結果の格納 43lambda_1_samples = trace.lambda_1 44lambda_2_samples = trace.lambda_2 45tau_samples = trace.tau 46 47#lambda_1, lambda_2 48fig, ax = plt.subplots(figsize=(18, 8)) 49ax.hist(lambda_1_samples, density=True, bins=np.arange(0, n_count, 0.1), align='left', label='lambda_1') 50ax.hist(lambda_2_samples, density=True, bins=np.arange(0, n_count, 0.1), align='left', label = 'lambda_2') 51ax.set_xlim(0, 50000) 52plt.legend() 53 54plt.show() 55 56# tau 57fig, ax = plt.subplots(figsize=(18, 4)) 58ax.hist(tau_samples, normed=True, rwidth=0.9, bins=np.arange(0, 30, 1), align='left', label='tau') 59ax.set_xticks(np.arange(0, 30, 1)) 60plt.legend() 61 62plt.show()
<おかしなところ1点目>
以下のMCMCが収束するところで、出てくるtauの結果が、一直線でおかしい。
python
1# 学習結果 2pm.traceplot(trace) 3
<おかしなところ2点目>
事後分布の、lambda_1, lambda_2の描画でヒストグラムが出てこない
<おかしなところ3点目>
以上、全体のコードでどこを書き換えるとこれらの描画がうまく出力されるか
教えて頂けますでしょうか。
あなたの回答
tips
プレビュー