本系列:
- 《第 0 节:导论》
- 《第 1 节:估计模型参数》
- 《第 2 节:模型检验》
- 《第 3 节:分层模型》
- 《第 4 节:贝叶斯回归》
- 待续
第3节:分层模型
贝叶斯模型的一个核心优势就是简单灵活,可以实现一个分层模型。这一节将实现和比较整体合并模型和局部融合模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import itertools import matplotlib.pyplot as plt import numpy as np import pandas as pd import pymc3 as pm import scipy import scipy.stats as stats import seaborn.apionly as sns from IPython.display import Image from sklearn import preprocessing %matplotlib inline plt.style.use('bmh') colors = ['#348ABD', '#A60628', '#7A68A6', '#467821', '#D55E00', '#CC79A7', '#56B4E9', '#009E73', '#F0E442', '#0072B2'] messages = pd.read_csv('data/hangout_chat_data.csv') |
模型合并
让我们采取一种不同的方式来对我的 hangout 聊天回复时间进行建模。我的直觉告诉我回复的快慢与聊天的对象有关。我很可能回复女朋友比回复一个疏远的朋友更快。这样,我可以对每个对话独立建模,对每个对话i估计参数 μi 和 αi。
一个必须考虑的问题是,有些对话相比其他的含有的消息很少。这样,和含有大量消息的对话相比,我们对含有较少消息的对话的回复时间的估计,就具有较大的不确定度。下图表明了每个对话在样本容量上的差异。
1 2 3 4 5 |
ax = messages.groupby('prev_sender')['conversation_id'].size().plot( kind='bar', figsize=(12,3), title='Number of messages sent per recipient', color=colors[0]) _ = ax.set_xlabel('Previous Sender') _ = ax.set_ylabel('Number of messages') _ = plt.xticks(rotation=45) |
对于每个对话i中的每条消息j,模型可以表示为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
indiv_traces = {} # Convert categorical variables to integer le = preprocessing.LabelEncoder() participants_idx = le.fit_transform(messages['prev_sender']) participants = le.classes_ n_participants = len(participants) for p in participants: with pm.Model() as model: alpha = pm.Uniform('alpha', lower=0, upper=100) mu = pm.Uniform('mu', lower=0, upper=100) data = messages[messages['prev_sender']==p]['time_delay_seconds'].values y_est = pm.NegativeBinomial('y_est', mu=mu, alpha=alpha, observed=data) y_pred = pm.NegativeBinomial('y_pred', mu=mu, alpha=alpha) start = pm.find_MAP() step = pm.Metropolis() trace = pm.sample( class="crayon-sy">() trace = pm.sample(ܚ
第3节:分层模型贝叶斯模型的一个核心优势就是简单灵活,可以实现一个分层模型。这一节将实现和比较整体合并模型和局部融合模型。
模型合并让我们采取一种不同的方式来对我的 hangout 聊天回复时间进行建模。我的直觉告诉我回复的快慢与聊天的对象有关。我很可能回复女朋友比回复一个疏远的朋友更快。这样,我可以对每个对话独立建模,对每个对话i估计参数 μi 和 αi。 一个必须考虑的问题是,有些对话相比其他的含有的消息很少。这样,和含有大量消息的对话相比,我们对含有较少消息的对话的回复时间的估计,就具有较大的不确定度。下图表明了每个对话在样本容量上的差异。
对于每个对话i中的每条消息j,模型可以表示为:
|