我正在使用Apache Math Library for Java来查找一组数据的OLS回归。但是,我偶尔会遇到以下错误:“org.apache.commons.math3.linear.SingularMatrixException:matrix is singular”
应用回归的数据并不总是相同的集合。它是遍历决策树后生成的集合。以下是产生此异常的示例数据集之一:
[1.41385, 0.0, 19.58, 1.0, 0.871, 6.129, 96.0, 1.7494, 5.0, 403.0, 14.7, 321.02, 15.12, 17.0,
0.59005, 0.0, 21.89, 0.0, 0.624, 6.372, 97.9, 2.3274, 4.0, 437.0, 21.2, 385.76, 11.12, 23.0,
8.24809, 0.0, 18.1, 0.0, 0.713, 7.393, 99.3, 2.4527, 24.0, 666.0, 20.2, 375.87, 16.74, 17.8,
2.44953, 0.0, 19.58, 0.0, 0.605, 6.402, 95.2, 2.2625, 5.0, 403.0, 14.7, 330.04, 11.32, 22.3,
2.14918, 0.0, 19.58, 0.0, 0.871, 5.709, 98.5, 1.6232, 5.0, 403.0, 14.7, 261.95, 15.79, 19.4,
2.3139, 0.0, 19.58, 0.0, 0.605, 5.88, 97.3, 2.3887, 5.0, 403.0, 14.7, 348.13, 12.03, 19.1,
2.3139, 0.0, 19.58, 0.0, 0.605, 5.88, 97.3, 2.3887, 5.0, 403.0, 14.7, 348.13, 12.03, 19.1,
2.44953, 0.0, 19.58, 0.0, 0.605, 6.402, 95.2, 2.2625, 5.0, 403.0, 14.7, 330.04, 11.32, 22.3,
8.24809, 0.0, 18.1, 0.0, 0.713, 7.393, 99.3, 2.4527, 24.0, 666.0, 20.2, 375.87, 16.74, 17.8,
2.3139, 0.0, 19.58, 0.0, 0.605, 5.88, 97.3, 2.3887, 5.0, 403.0, 14.7, 348.13, 12.03, 19.1,
2.3004, 0.0, 19.58, 0.0, 0.605, 6.319, 96.1, 2.1, 5.0, 403.0, 14.7, 297.09, 11.1, 23.8,
5.66637, 0.0, 18.1, 0.0, 0.74, 6.219, 100.0, 2.0048, 24.0, 666.0, 20.2, 395.69, 16.59, 18.4,
5.66637, 0.0, 18.1, 0.0, 0.74, 6.219, 100.0, 2.0048, 24.0, 666.0, 20.2, 395.69, 16.59, 18.4,
2.3139, 0.0, 19.58, 0.0, 0.605, 5.88, 97.3, 2.3887, 5.0, 403.0, 14.7, 348.13, 12.03, 19.1,
2.3139, 0.0, 19.58, 0.0, 0.605, 5.88, 97.3, 2.3887, 5.0, 403.0, 14.7, 348.13, 12.03, 19.1,
14.0507, 0.0, 18.1, 0.0, 0.597, 6.657, 100.0, 1.5275, 24.0, 666.0, 20.2, 35.05, 21.22, 17.2]
nobs: 16 nvars: 13
如何避免收到此错误?是否存在类似于概述here的python的Java解决方案。
答案 0 :(得分:4)
今天我遇到了与Apache commons-math OLS相同的问题。 我解决了这个问题,消除了仅由零组成的行和列。 例如,在您的情况下,如果删除第二列,矩阵将是非单数的,OLS将起作用。
我希望能提供帮助。
答案 1 :(得分:1)
假设上面矩阵的列是变量,那么相同的0将导致此异常。为了使普通最小二乘问题具有唯一解,独立变量必须是线性独立的(没有列可以是其他任何子集的线性组合)。完整的0列违反了这一点。有关估算OLS模型所需内容的详细信息,请参阅https://en.wikipedia.org/wiki/Ordinary_least_squares。如果未定义无线性相关条件,则会产生SingularMatrixException。
为了帮助您直观地理解这一点,请考虑您要求算法执行的操作。您希望它获得最佳系数集b 0 ,b 1 ,...,b n 这样的模型
y = b 0 + b 1 x 1 + ... + b n x n < / sub>
比b i 的任何其他选择更适合数据。如果x 1 始终为0,那么b 1 的结果没有区别 - 所以没有唯一的解决方案。同样,如果说x 1 = 2x 2 + x 3 ,你决定选择b 1 ,b 2 和b 3 ,您可以通过无限的其他方式设置它们,从而为模型的该部分提供完全相同的值。