【问题标题】:NA/NaN/Inf error when fitting HMM using depmixS4 in R在 R 中使用 depmixS4 拟合 HMM 时出现 NA/NaN/Inf 错误
【发布时间】:2014-10-11 09:35:50
【问题描述】:

我正在尝试使用 depmix 在 R 中拟合简单的隐藏马尔可夫模型。但我有时会遇到一些晦涩难懂的错误(外部函数调用中的 Na/NaN/Inf)。比如

 require(depmixS4)
 t = data.frame(v=c(0.0622031327669583,-0.12564002739468,-0.117354660120178,0.0115062213361335,0.122992418345013,-0.0177816909620965,0.0164821157439354,0.161981367176501,-0.174367935386872,0.00429417498601576,0.00870091566593177,-0.00324734222267713,-0.0609817740148078,0.0840679943325736,-0.0722982123741866,0.00309386232501072,0.0136237132601905,-0.0569072400881981,0.102323872007477,-0.0390675463642003,0.0373248728294635,-0.0839484669503484,0.0514620475651086,-0.0306598076180909,-0.0664992242224042,0.826857872461293,-0.172970803143762,-0.071091459861684,-0.0128631184461384,-0.0439382422065227,-0.0552809574423446,0.0596321725192134,-0.06043926984848,0.0398700063815422))
 mod = depmix(response=v~1, data=t, nstates=2)
 fit(mod)
 ...
 NA/NaN/Inf in foreign function call (arg 10)

而且我可以输入几乎相同大小和复杂性的工作正常...这里有 depmixS4 的首选工具吗?

【问题讨论】:

  • 你能弄清楚这个吗?

标签: r machine-learning statistics


【解决方案1】:

在给定任意数量的状态时,不能保证 EM 算法可以找到适合每个数据集的方法。例如,如果您尝试将 2 状态高斯模型拟合到从 lambda = 1 的泊松分布生成的数据,您将收到相同的错误。

set.seed(3)
ydf <- data.frame(y=rpois(100,1))    
m1 <- depmix(y~1,ns=2,family=gaussian(),data=ydf)
fit(m1)

iteration 0 logLik: -135.6268 
iteration 5 logLik: -134.2392 
iteration 10 logLik: -128.7834 
iteration 15 logLik: -111.5922 
Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object),  : 
  NA/NaN/Inf in foreign function call (arg 10)

关于您的数据,您可以使用 1 个状态将模型拟合到您的数据中。对于 2 个状态,算法无法找到解决方案(即使有 10000 个随机开始)。对于 3 个状态,问题似乎与模型起始状态的初始化有关。如果尝试使用您提供的数据运行相同的模型 100 次,您会在 100 次迭代中的一些迭代中获得收敛。下面的例子:

 >require(depmixS4)
 >t = data.frame(v=c(0.0622031327669583,-0.12564002739468,-0.117354660120178,0.0115062213361335,0.122992418345013,-0.0177816909620965,0.0164821157439354,0.161981367176501,-0.174367935386872,0.00429417498601576,0.00870091566593177,-0.00324734222267713,-0.0609817740148078,0.0840679943325736,-0.0722982123741866,0.00309386232501072,0.0136237132601905,-0.0569072400881981,0.102323872007477,-0.0390675463642003,0.0373248728294635,-0.0839484669503484,0.0514620475651086,-0.0306598076180909,-0.0664992242224042,0.826857872461293,-0.172970803143762,-0.071091459861684,-0.0128631184461384,-0.0439382422065227,-0.0552809574423446,0.0596321725192134,-0.06043926984848,0.0398700063815422))
 >mod = depmix(response=v~1, data=t, nstates=2)
 >fit(mod)
 ...
 NA/NaN/Inf in foreign function call (arg 10)

>replicate(100, try(fit(mod, verbose = F)))

[[1]]
[1] "Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object),  : \n  NA/NaN/Inf in foreign function call (arg 10)\n"

[[2]]
[1] "Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object),  : \n  NA/NaN/Inf in foreign function call (arg 10)\n"

[[3]]
Convergence info: Log likelihood converged to within tol. (relative change) 
'log Lik.' 34.0344 (df=14)
AIC:  -40.0688 
BIC:  -18.69975 
... output truncated

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2014-03-18
    • 2021-03-11
    • 2017-12-17
    • 2015-12-30
    • 2019-04-04
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多