executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
fit-hidden-markov-model使用 Baum-Welch(EM)算法拟合隐马尔可夫模型,包含模型选择、用于状态序列的 Viterbi 解码以及前向-后向概率。适用于观测由不可观测的隐状态生成时、需要将 时间序列分割为隐含状态(市场状态、语音音素、生物序列)时、计算序列概率、 解码最可能的隐状态路径,或比较不同隐状态数目的模型。
Independent GitHub snapshot · Automated classification · Original documentation governs
使用 Baum-Welch 期望最大化算法将隐马尔可夫模型(HMM)拟合到序列观测数据,通过 Viterbi 解码最可能的隐状态序列,并通过信息准则选择最优隐状态数目。
| 输入 | 类型 | 描述 |
|---|---|---|
observations | sequence/matrix | 观测数据序列(单变量或多变量) |
n_hidden_states | integer | 要拟合的隐状态数(或用于模型选择的范围) |
emission_type | string | 发射分布族:"gaussian"、"discrete"、"poisson"、"multinomial" |
| 输入 | 类型 | 默认值 | 描述 |
|---|---|---|---|
initial_params | dict | random/heuristic | 初始转移矩阵、发射参数和初始概率 |
n_restarts | integer | 10 | 随机重启次数以缓解局部最优 |
max_iterations | integer | 500 | 每次重启的最大 EM 迭代次数 |
convergence_tol | float | 1e-6 | EM 的对数似然收敛阈值 |
state_range | list of ints | [n_hidden_states] | 用于模型选择的状态数范围 |
covariance_type | string | "full" | 高斯发射:"full"、"diagonal"、"spherical" |
regularization | float | 1e-6 | 添加到协方差矩阵对角线的小常数以防止奇异 |
1.1. 指定隐状态数 K(或在第 5 步中用于模型选择的候选范围)。
1.2. 根据数据类型选择发射分布族:
1.3. 定义模型组件:
A,大小 K x K:A[i,j] = P(z_t = j | z_{t-1} = i)theta_k,每个状态 k:分布特定(如高斯的均值和协方差)pi:pi[k] = P(z_1 = k)1.4. 验证观测数据格式正确:序列中无缺失值,维度一致,且长度相对于参数数量足够。
预期结果: 清晰指定的 HMM 架构,具有 K 个状态、已选择的发射族和长度 T >> K^2 的干净观测数据。
失败处理: 如果数据包含缺失值,插补或删除受影响的段。如果 T 相对于 K 太小,减少 K 或获取更多数据。
2.1. 为每次 n_restarts 重启生成初始参数:
2.2. 对于第一次重启,使用 K-means 知情的初始化(通常是最强的起始)。对于后续重启,使用随机扰动。
2.3. 验证所有初始参数有效:
预期结果: n_restarts 组有效的初始参数,至少有一个数据驱动的初始化。
失败处理: 如果 K-means 无法收敛,使用更多重启的纯随机初始化。如果协方差矩阵奇异,将正则化常数添加到对角线。
3.1. E 步(前向-后向算法):
alpha[t,k] = P(o_1,...,o_t, z_t=k | model):
alpha[1,k] = pi[k] * b_k(o_1)alpha[t,k] = sum_j(alpha[t-1,j] * A[j,k]) * b_k(o_t)beta[t,k] = P(o_{t+1},...,o_T | z_t=k, model):
beta[T,k] = 1beta[t,k] = sum_j(A[k,j] * b_j(o_{t+1}) * beta[t+1,j])gamma[t,k] = P(z_t=k | O, model):
gamma[t,k] = alpha[t,k] * beta[t,k] / P(O | model)xi[t,i,j] = P(z_t=i, z_{t+1}=j | O, model)。3.2. M 步(参数重估计):
A[i,j] = sum_t(xi[t,i,j]) / sum_t(gamma[t,i])mu_k = sum_t(gamma[t,k] * o_t) / sum_t(gamma[t,k])b_k(v) = sum_t(gamma[t,k] * I(o_t=v)) / sum_t(gamma[t,k])pi[k] = gamma[1,k]3.3. 计算对数似然:log P(O | model) = log sum_k(alpha[T,k])。使用 log-sum-exp 技巧防止下溢。
3.4. 缩放: 使用缩放的前向-后向变量防止长序列的数值下溢。在每个时间步归一化 alpha 并累积对数缩放因子。
3.5. 重复 E 步和 M 步直到对数似然变化低于 convergence_tol 或达到 max_iterations。
3.6. 在所有重启中,保留最终对数似然最高的参数集。
预期结果: 各迭代间对数似然单调非递减,在 max_iterations 内收敛。最终参数有效(行随机矩阵、正定协方差)。
失败处理: 如果对数似然下降,E 步或 M 步中有 bug——验证公式。如果收敛非常慢,尝试更好的初始化或增加 max_iterations。如果协方差变得奇异,增加正则化。
4.1. 初始化 Viterbi 变量:
delta[1,k] = log(pi[k]) + log(b_k(o_1))psi[1,k] = 0(无前驱)4.2. 对 t = 2,...,T 前向递推:
delta[t,k] = max_j(delta[t-1,j] + log(A[j,k])) + log(b_k(o_t))psi[t,k] = argmax_j(delta[t-1,j] + log(A[j,k]))4.3. 终止:
z*_T = argmax_k(delta[T,k])max_k(delta[T,k])4.4. 对 t = T-1,...,1 回溯:
z*_t = psi[t+1, z*_{t+1}]4.5. 输出解码的状态序列 z* = (z*_1, ..., z*_T) 及其对数概率。
4.6. 将 Viterbi 路径概率与前向算法的总序列概率进行比较,评估最佳路径的主导程度。
预期结果: 长度为 T 的单个最可能状态序列,每个条目在 {1,...,K} 中。Viterbi 对数概率应小于等于总对数似然。
失败处理: 如果 Viterbi 路径的对数概率为负无穷,某些转移或发射概率在不应该为零的地方为零。添加下限值防止 log(0)。
5.1. 对 state_range 中每个候选隐状态数 K,拟合完整的 HMM(第 2-4 步)。
5.2. 计算自由参数数 p:
K * (K - 1)(每行是一个单纯形)d 维全协方差高斯:K * (d + d*(d+1)/2))K - 15.3. 计算信息准则:
BIC = -2 * log_likelihood + p * log(T)AIC = -2 * log_likelihood + 2 * pAICc = AIC + 2*p*(p+1) / (T - p - 1)(小样本校正)5.4. 选择 BIC 最低(一致性优先)或 AIC 最低(预测优先)的模型。同时报告两者。
5.5. 汇总结果:对每个 K,显示对数似然、参数数、BIC、AIC 和收敛状态。
5.6. 如果最优 K 在 state_range 的边界上,扩展范围并重新拟合。
预期结果: BIC/AIC 中存在明确的最小值,标识最优隐状态数。所选模型应已收敛且状态含义可解释。
失败处理: 如果不存在明确的最小值(BIC 单调递减),模型可能设定错误——考虑不同的发射族。如果所有模型的对数似然都较差,数据可能不遵循 HMM 结构。
6.1. 将数据分为训练集和验证集(如 80/20 或使用多个序列)。
6.2. 在训练数据上拟合模型。使用前向算法在留出数据上计算对数似然(不重新拟合参数)。
6.3. 后验解码(Viterbi 的替代方法):
z^_t = argmax_k(gamma[t,k])6.4. 比较 Viterbi 和后验解码:
6.5. 评估状态可解释性:
A 的对角线隐含)是否合理。6.6. 计算每个观测的留出对数似然,并跨模型阶数比较以确认训练集模型选择。
预期结果: 留出对数似然与训练对数似然合理接近(无严重过拟合)。Viterbi 和后验解码在 90%+ 的时间步上一致。状态具有不同的、可解释的发射分布。
失败处理: 如果留出似然比训练差很多,模型过拟合——减少 K 或增加正则化。如果状态不可解释,尝试不同的初始化或不同的发射族。
P(O) = sum_k(alpha[T,k]) = sum_k(pi[k] * b_k(o_1) * beta[1,k])O(K + d^2) 个参数。使用 BIC(不仅是似然)进行模型选择并在留出数据上验证