映画サイトのレビュー(星マークの0〜5)の妥当性をベイズ推論で評価しようと考えてます。
▼変数の説明
review_rate →これがレビュー(0〜5で投稿されたものの平均)
review_num →レビューの投稿数
これに対して、以下の通りモデルの設計をしました。
python
1##------------------------------- 2# モデルの設計 3##------------------------------- 4 5# レビュー評価の事後分布の軌跡(trace)を取得する 6# レビューの評価は0.0〜5.0のものを、0~1の範囲の一様分布で扱うため、引数で与えられた値に対して調整を加える 7# name は確率変数名 8def get_posterior_review_rate_trace(review_rate, review_num): 9 _review_rate = pm.Uniform(name='review_rate', lower=0, upper=1) 10 review_rate_0_to_1 = (review_rate - 1) * 0.25 11 print('0~1の範囲でのレビュー評価 : ', review_rate_0_to_1) 12 13 # 連続確率変数のためBeta分布を使用 14 theta = pm.Beta(name='theta', alpha=1, beta=1) 15 observations = pm.Binomial( 16 # nはレビュー数、valueはレビュー評価にレビュー数を乗算した値を指定 17 name='obs', n=review_num, p=theta, 18 value=review_rate_0_to_1 * review_num, 19 observed=True) 20 map_ = pm.MAP([theta, observations]).fit() 21 model = pm.Model([theta, observations]) 22 mcmc = pm.MCMC(model) 23 # MCMCの探索を。第一引数は探索回数。第二引数のバーンインは最初の収束していない一定数は好ましくないので破棄して5000件目~20000件目のサンプリング結果を取得 24 mcmc.sample(20000, 5000) 25 # 探索結果のthetaの確率変数の軌跡を取得 26 trace = mcmc.trace('theta') 27 return trace 28
次に、モデルの妥当性を評価するため、以下の処理を実行しました。
python
1##------------------------------- 2# モデルの妥当性を確認 3##------------------------------- 4import pymc3 as pm 5from pymc3 import plots as mcplot 6 7 8# レビュー評価4.5に対して、取得した軌跡(trace)を引数に渡して事後分布の確認 9trace_of_review_num_2 = get_posterior_review_rate_trace( 10 review_rate=4.5, review_num=2)
その結果、事後分布を確認するつもりなのですが、
ここで、以下のエラーが発生してしまいます。
IndexError Traceback (most recent call last)
~/anaconda3/lib/python3.7/site-packages/pymc3/model.py in get_context(cls, error_if_none)
212 try:
--> 213 candidate = cls.get_contexts()[idx] # type: Optional[T]
214 except IndexError as e:IndexError: list index out of range
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
~/anaconda3/lib/python3.7/site-packages/pymc3/distributions/distribution.py in new(cls, name, *args, **kwargs)
32 try:
---> 33 model = Model.get_context()
34 except TypeError:~/anaconda3/lib/python3.7/site-packages/pymc3/model.py in get_context(cls, error_if_none)
217 if error_if_none:
--> 218 raise TypeError("No %s on context stack"%str(cls))
219 return NoneTypeError: No <class 'pymc3.model.Model'> on context stack
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-3-3c1692da3682> in <module>
1 # レビュー評価4.5に対して、取得した軌跡(trace)を引数に渡して事後分布の確認
2 trace_of_review_num_2 = get_posterior_review_rate_trace(
----> 3 review_rate=4.5, review_num=2)<ipython-input-1-04c321e246cf> in get_posterior_review_rate_trace(review_rate, review_num)
30 # name は確率変数名
31 def get_posterior_review_rate_trace(review_rate, review_num):
---> 32 _review_rate = pm.Uniform(name='review_rate', lower=0, upper=1)
33 review_rate_0_to_1 = (review_rate - 1) * 0.25
34 print('0~1の範囲でのレビュー評価 : ', review_rate_0_to_1)~/anaconda3/lib/python3.7/site-packages/pymc3/distributions/distribution.py in new(cls, name, *args, **kwargs)
33 model = Model.get_context()
34 except TypeError:
---> 35 raise TypeError("No model on context stack, which is needed to "
36 "instantiate distributions. Add variable inside "
37 "a 'with model:' block, or use the '.dist' syntax "TypeError: No model on context stack, which is needed to instantiate distributions. Add variable inside a 'with model:' block, or use the '.dist' syntax for a standalone distribution.
上記を解消するためのコードを教えていただけませんでしょうか。
回答1件
あなたの回答
tips
プレビュー