当前位置: 首页 > news >正文

输入驱动HMM实战:用SSM构建GLM-HMM模型,揭示外部 covariates如何影响状态转移

输入驱动HMM实战:用SSM构建GLM-HMM模型,揭示外部 covariates如何影响状态转移

【免费下载链接】ssmBayesian learning and inference for state space models项目地址: https://gitcode.com/gh_mirrors/ssm38/ssm

SSM(State Space Models)是一个强大的贝叶斯学习与推理工具包,专注于状态空间模型的构建与分析。本文将带你通过实战案例,学习如何使用SSM构建GLM-HMM(广义线性模型-隐马尔可夫模型),深入理解外部 covariates如何影响系统的状态转移过程。

什么是GLM-HMM?

GLM-HMM是一种融合了广义线性模型(GLM)和隐马尔可夫模型(HMM)的混合模型。与传统HMM不同,GLM-HMM假设观测概率依赖于外部输入 covariates,而状态转移概率保持平稳。这种结构特别适合分析外部因素如何影响系统的动态行为,例如动物在决策任务中的行为模式。

在GLM-HMM中,观测概率的计算方式如下:

对于类别c ≠ C: $$ \Pr(y_t = c \mid z_{t} = k, u_t, w_{kc}) = \frac{\exp{w_{kc}^\mathsf{T} u_t}}{1+\sum_{c'=1}^{C-1} \exp{w_{kc'}^\mathsf{T} u_t}} $$

对于类别c = C: $$ \Pr(y_t = c \mid z_{t} = k, u_t, w_{kc}) = \frac{1}{1+\sum_{c'=1}^{C-1} \exp{w_{kc'}^\mathsf{T} u_t}} $$

其中,$u_{t}$ 是输入协变量,$w_{kc}$ 是与状态k和类别c相关的权重参数。

快速入门:用SSM构建GLM-HMM模型

环境准备

首先,确保你已经安装了SSM库。如果还没有安装,可以通过以下命令获取项目代码并安装:

git clone https://gitcode.com/gh_mirrors/ssm38/ssm cd ssm pip install -e .

初始化GLM-HMM模型

使用SSM构建GLM-HMM模型非常简单。以下代码展示了如何创建一个具有输入驱动观测的HMM:

import ssm # 设置模型参数 num_states = 3 # 离散状态数量 obs_dim = 1 # 观测维度 num_categories = 2 # 输出类别数量 input_dim = 2 # 输入维度 # 创建GLM-HMM模型 glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations="input_driven_obs", observation_kwargs=dict(C=num_categories), transitions="standard")

实战案例:模拟动物决策行为

生成模型参数

我们模拟一个动物在2AFC(二选一)决策任务中的行为。设置3个状态,每个状态具有不同的GLM权重和转移概率:

# 设置生成模型的权重和转移矩阵 gen_weights = np.array([[[6, 1]], [[2, -3]], [[2, 3]]]) gen_log_trans_mat = np.log(np.array([[[0.98, 0.01, 0.01], [0.05, 0.92, 0.03], [0.03, 0.03, 0.94]]])) # 应用参数到模型 true_glmhmm.observations.params = gen_weights true_glmhmm.transitions.params = gen_log_trans_mat

模拟输入序列和观测数据

我们生成模拟的外部输入序列,包括刺激值和偏置项,然后使用模型生成观测数据:

# 创建外部输入序列 num_sess = 20 # 会话数量 num_trials_per_sess = 100 # 每个会话的试次数 inpts = np.ones((num_sess, num_trials_per_sess, input_dim)) stim_vals = [-1, -0.5, -0.25, -0.125, -0.0625, 0, 0.0625, 0.125, 0.25, 0.5, 1] inpts[:,:,0] = np.random.choice(stim_vals, (num_sess, num_trials_per_sess)) inpts = list(inpts) # 生成状态和观测数据 true_latents, true_choices = [], [] for sess in range(num_sess): true_z, true_y = true_glmhmm.sample(num_trials_per_sess, input=inpts[sess]) true_latents.append(true_z) true_choices.append(true_y)

模型拟合与参数恢复

最大似然估计(MLE)

使用EM算法拟合模型:

# 创建新的GLM-HMM模型 new_glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations="input_driven_obs", observation_kwargs=dict(C=num_categories), transitions="standard") # 拟合模型 N_iters = 200 fit_ll = new_glmhmm.fit(true_choices, inputs=inpts, method="em", num_iters=N_iters, tolerance=10**-4)

状态 permutation 与参数比较

由于HMM状态具有可交换性,我们需要对状态进行permutation以与真实模型比较:

from ssm.util import find_permutation # 对状态进行permutation new_glmhmm.permute(find_permutation(true_latents[0], new_glmhmm.most_likely_states(true_choices[0], input=inpts[0]))) # 比较恢复的权重和转移矩阵与真实参数 recovered_weights = new_glmhmm.observations.params recovered_trans_mat = np.exp(new_glmhmm.transitions.log_Ps)

高级技巧:最大后验估计(MAP)与交叉验证

使用MAP估计处理小数据问题

在数据量有限时,MAP估计可以通过引入先验知识提高模型泛化能力:

# 创建带先验的GLM-HMM模型 prior_sigma = 2 prior_alpha = 2 map_glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations="input_driven_obs", observation_kwargs=dict(C=num_categories, prior_sigma=prior_sigma), transitions="sticky", transition_kwargs=dict(alpha=prior_alpha, kappa=0)) # 用MAP估计拟合模型 _ = map_glmhmm.fit(true_choices, inputs=inpts, method="em", num_iters=N_iters, tolerance=10**-4)

交叉验证选择最佳模型

通过交叉验证比较MLE和MAP估计的性能:

# 生成测试数据 num_test_sess = 10 test_inpts = np.ones((num_test_sess, num_trials_per_sess, input_dim)) test_inpts[:,:,0] = np.random.choice(stim_vals, (num_test_sess, num_trials_per_sess)) test_inpts = list(test_inpts) # 比较模型在测试数据上的似然度 mle_test_ll = new_glmhmm.log_likelihood(test_choices, inputs=test_inpts) map_test_ll = map_glmhmm.log_likelihood(test_choices, inputs=test_inpts)

扩展应用:多项GLM-HMM

SSM同样支持多类别输出的GLM-HMM模型。以下是一个具有3个输出类别的示例:

# 设置多项GLM-HMM参数 num_states = 4 num_categories = 3 input_dim = 2 # 创建多项GLM-HMM模型 multinom_glmhmm = ssm.HMM(num_states, obs_dim, input_dim, observations="input_driven_obs", observation_kwargs=dict(C=num_categories), transitions="standard")

总结与资源

通过本文的介绍,你已经了解了如何使用SSM构建和应用GLM-HMM模型来分析外部 covariates对状态转移的影响。关键步骤包括:

  1. 模型初始化与参数设置
  2. 数据模拟与准备
  3. 使用EM算法进行模型拟合
  4. 参数恢复与模型评估
  5. 高级估计方法与模型选择

要深入学习更多内容,可以参考项目中的示例代码和文档:

  • 官方示例:notebooks/2b-Input-Driven-Observations-(GLM-HMM).py.py)
  • 模型实现:ssm/hmm.py
  • 观测模型:ssm/observations.py

希望这篇教程能帮助你更好地理解和应用GLM-HMM模型分析复杂的动态系统!

【免费下载链接】ssmBayesian learning and inference for state space models项目地址: https://gitcode.com/gh_mirrors/ssm38/ssm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1368071/

相关文章:

  • Nutgram 缓存与日志系统配置:优化机器人性能与调试体验
  • 为什么选择gh_mirrors/clas/classifier?5大核心优势深度解析
  • Hickory性能优化:处理大型HTML文档的10个实用技巧
  • audit-trigger深度解析:如何通过触发器记录PostgreSQL表的INSERT/UPDATE/DELETE操作
  • Rust Music Theory实战:用nocturne.rs示例学习音乐编程
  • ghc-mod核心功能解析:从代码补全到类型信息查询
  • OncePower:本地批量重命名工具,高效解决文件命名混乱
  • 做会议纪要神器app怎么选:2026评测听脑AI和钉钉闪记两款工具 - AI办公提效专家
  • 如何快速升级老款Mac:OpenCore Legacy Patcher完整指南
  • 2026兴趣培训专业GEO服务商全维度选型指南 正规机构甄选标准+签约避坑FAQ - 商业大观
  • 轻松实现Unity颜色交互:HSV-Color-Picker-Unity事件系统全解析
  • 单细胞RNA-seq数据分析:GSEApy的ssGSEA模块应用案例
  • Tailwind CSS与Next.js完美结合:Awesome Next.js UI组件库精选
  • 如何用3分钟免费改造Windows 11:ExplorerPatcher让经典界面完美回归
  • RepoEval基准测试深度解读:3大场景+8个真实仓库,全面评估代码补全模型性能
  • 2026江门卫生间漏水避坑指南 - 企业资讯
  • 轻量级CNN新标杆:efficientnet_el_pruned.in1k与传统模型对比分析
  • 终极Emacs包管理工具Quelpa:安装与配置的5分钟快速入门
  • flutter_login_signup跨平台适配:Android与iOS登录界面一致性实现方案
  • Hickory核心组件解析:convert、render与select模块的协同工作
  • 双曲冲孔仿石材铝单板厂家怎么选?5家主流服务商横向对比 - 生活动态圈
  • RepoCoder完全指南:微软开源仓库级代码补全神器,3步实现10%+准确率提升
  • 刷墙包工包料每平方米多少钱,2026年价格构成与避坑指南 - 行业洞察分析师
  • 终极指南:如何快速配置nx-hbmenu,打造完美Switch自制软件管理体验
  • SignalHub完全指南:构建WebRTC实时通信的终极信令服务器
  • 终极指南:4步让老款Mac焕发新生,免费升级到最新macOS
  • Kubernetes环境下的Bastion安全实践:与GitHub Authorized Keys无缝集成指南
  • docker-ddns常见问题排查:解决端口冲突、权限错误与DNS更新失败
  • kiswitch核心功能解析:从PCB焊盘到热插拔座,一站式键盘元件解决方案
  • 2026茂名卫生间漏水避坑指南 - 企业资讯