用 Python 进行贝叶斯模型建模(3)
admin
2023-07-31 00:46:24
0

本系列:

  • 《第 0 节:导论》
  • 《第 1 节:估计模型参数》
  • 《第 2 节:模型检验》
  • 《第 3 节:分层模型》
  • 《第 4 节:贝叶斯回归》
  • 待续

第3节:分层模型

贝叶斯模型的一个核心优势就是简单灵活,可以实现一个分层模型。这一节将实现和比较整体合并模型和局部融合模型。

1234567891011121314151617181920 import itertoolsimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport pymc3 as pmimport scipyimport scipy.stats as statsimport seaborn.apionly as sns from IPython.display import Imagefrom 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。

一个必须考虑的问题是,有些对话相比其他的含有的消息很少。这样,和含有大量消息的对话相比,我们对含有较少消息的对话的回复时间的估计,就具有较大的不确定度。下图表明了每个对话在样本容量上的差异。

12345 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,模型可以表示为:

y_{ji} \\sim NegBinomial(\\mu_i, \\alpha_i)
\\mu_i = Uniform(0, 100)
\\alpha_i = Uniform(0, 100)

 

1234567891011121314151617181920212223 indiv_traces = {} # Convert categorical variables to integerle = 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(ܚ

  • 《第 0 节:导论》
  • 《第 1 节:估计模型参数》
  • 《第 2 节:模型检验》
  • 《第 3 节:分层模型》
  • 《第 4 节:贝叶斯回归》
  • 待续

第3节:分层模型

贝叶斯模型的一个核心优势就是简单灵活,可以实现一个分层模型。这一节将实现和比较整体合并模型和局部融合模型。

1234567891011121314151617181920 import itertoolsimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport pymc3 as pmimport scipyimport scipy.stats as statsimport seaborn.apionly as sns from IPython.display import Imagefrom 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。

一个必须考虑的问题是,有些对话相比其他的含有的消息很少。这样,和含有大量消息的对话相比,我们对含有较少消息的对话的回复时间的估计,就具有较大的不确定度。下图表明了每个对话在样本容量上的差异。

12345 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,模型可以表示为:

y_{ji} \\sim NegBinomial(\\mu_i, \\alpha_i)
\\mu_i = Uniform(0, 100)
\\alpha_i = Uniform(0, 100)

 

1234567891011121314151617181920212223 indiv_traces = {} # Convert categorical variables to integerle = 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.

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...