【问题标题】:org.apache.commons.math3.linear.SingularMatrixException: matrix is singularorg.apache.commons.math3.linear.SingularMatrixException:矩阵是奇异的
【发布时间】:2016-08-04 15:18:44
【问题描述】:

我正在使用 cloudera 库 com.cloudera.sparkts 对一组值进行时间序列预测。

var model = ARIMA.fitModel(1,0,2,mySeries)
model.forecast(newSeries,10)

在执行此操作时,我收到如下所示的异常:

ERROR Executor: Managed memory leak detected; size = 5255488 bytes, TID = 12
ERROR Executor: Exception in task 0.0 in stage 17.0 (TID 12)
org.apache.commons.math3.linear.SingularMatrixException: matrix is singular
at org.apache.commons.math3.linear.QRDecomposition$Solver.solve(QRDecomposition.java:354)

在将系列传递给模型之前,我正在检查系列是否具有相同的值,如果值相同,则不执行操作。

有没有办法解决这个异常?

【问题讨论】:

    标签: scala apache-spark cloudera


    【解决方案1】:

    我不认为singular在这里意味着你的系列有一个价值,而是解决方案Matrix is Singular

    换句话说,你的方程(拟合)没有真正的解决方案。

    【讨论】:

    • 从序列中评估模型的第一个语句本身在执行期间中断。那么无论如何,我可以通过检查系列来避免这种情况?
    • @rvp 我真的不熟悉ARIMA。我会尝试将系列长度限制为更大的数字,或搜索类似于ARIMA.isModelFittable 的方法。
    【解决方案2】:

    我试图将各种模型应用于多个系列,在这之间,我遇到了这个异常,我的执行被打破了。

    Cloudera 时间序列库中没有可用的功能来检查模型是否适合时间序列集合。所以我通过捕获异常并忽略这些模型来控制这个异常。因此,即使某些型号不适合该系列,我也可以通过忽略不合格的型号使其适合其他型号。

    var model1Passed = true
    try{
         var model1 = ARIMA.fitModel(1,0,1,series)
       }
    catch{
         case _: Throwable => model1Passed = false
       }
    

    创建模型后,您可以通过检查 AIC(Akaike 信息标准)值来检查模型兼容性,如下所示:

    val AICval = model1.approxAIC(series)
    

    AIC 值越小表示模型越好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多