"system is computationally singular" brnn 包
"system is computationally singular" brnn package
我正在使用 brnn
包来使正则化神经网络适合我的数据。在某些情况下,我会收到错误消息:
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 2.29108e-20
我在 Whosebug 上阅读了与此主题相关的所有问题,但解决方案并不直接适用于我的问题。目前我知道:
- 问题出在
brnn()
函数,它依赖于solve()
函数。解决方案是减少公差(brnn
包中的 tol
参数)。我确实减少了它,但问题仍然存在。
- 预测变量的多重线性。这是不可能的,因为我只有一个自变量。
- 我卡在这里了..
GitHub brnn package
的网站
我的一小部分代码,可用于重现错误:
1. 创建数据
temporal_df = structure(list(x = c(-0.553333333333333, -3.56, -2.36333333333333,
1.48666666666667, 1.15, 0.636666666666667, -0.593333333333333,
-1.52, -2.56, -0.156666666666667, -1.09666666666667, 0.96, 0.02,
1.73333333333333, 0.34, 1.25666666666667, -0.396666666666667,
-1.15, 2.95, -1.95333333333333, -0.293333333333333, 4.33333333333333,
0.35, 1.41666666666667, 3.36666666666667, -1.54333333333333,
1.1, 0.32, 2.42, 0.34, -1.82333333333333, 1.88333333333333, 2.07666666666667,
1.96, 2.25333333333333, 0.303333333333333, 2.81333333333333,
-3.14, 0.776666666666667, 4.93, -2.16666666666667, 2.41333333333333,
2.23333333333333, 1.71666666666667, 0.623333333333333, 4.85666666666667,
0.436666666666667, 2.56333333333333, 2.21666666666667, 0.0133333333333334,
3.38333333333333, 1.51666666666667), MVA = c(7.1856694, 5.598461,
5.872606, 6.5031284, 5.6605362, 6.002758, 6.018826, 7.3664676,
5.7172694, 5.9872138, 6.07253916666667, 5.87814966666667, 5.132916,
6.26116966666667, 5.7409835, 5.75330233333333, 5.93054783333333,
5.52767016666667, 5.5299795, 5.8777515, 5.501568, 5.696386, 5.74542866666667,
5.45688033333333, 5.14158866666667, 6.22877433333333, 6.39709566666667,
6.82969366666667, 6.709905, 6.06170333333333, 6.11582483333333,
6.20273833333333, 6.709709, 6.40844766666667, 6.15858716666667,
5.9047125, 6.1760875, 6.86213666666667, 6.45906283333334, 7.02090133333333,
6.467793, 6.47158383333333, 6.76265383333333, 6.10339883333333,
7.23381633333333, 6.75162833333333, 6.59454716666667, 6.50917566666667,
6.66505483333333, 7.58141116666667, 7.15875233333333, 7.742872
)), .Names = c("x", "MVA"), row.names = c(NA, -52L), class = "data.frame")
现在拟合 brnn 模型:
#install.packages('brnn')
library(brnn)
temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-30)
在第一个建议的解决方案之后编辑:
一种可能的解决方案是设置 tol = 1e-6
。这实际上只是部分地解决了问题。我仍然在大约 1/3 的重复中得到错误。因此,我相信应该有别的东西。
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 5.01465e-19
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 7.24518e-19
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 1.04673e-17
数字 1e-30 比典型的 "essentially equal to zero number" 1e-16 小得多。选择该数字的基础是它接近 2.2e-32 的平方根,这是 POSIX 标准 8 字节浮点表示 "doubles" 的精度极限。我从未见过任何 R 大师使用如此小的数字。请参阅 CV.com 上的解释:How do I force the L-BFGS-B to not early stop? https://stats.stackexchange.com/questions/126251/how-do-i-force-the-l-bfgs-b-to-not-stop-early-projected-gradient-is-zero
这也是不必要的,因为如果默认容差保留在 1e-6,对 brnn
的调用(有时)运行时不会出错:
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
当此方法运行无误时(伪随机事件),您的数据中确实没有结构,并且预测是统一的并且非常接近平均值。
我正在使用 brnn
包来使正则化神经网络适合我的数据。在某些情况下,我会收到错误消息:
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 2.29108e-20
我在 Whosebug 上阅读了与此主题相关的所有问题,但解决方案并不直接适用于我的问题。目前我知道:
- 问题出在
brnn()
函数,它依赖于solve()
函数。解决方案是减少公差(brnn
包中的tol
参数)。我确实减少了它,但问题仍然存在。 - 预测变量的多重线性。这是不可能的,因为我只有一个自变量。
- 我卡在这里了..
GitHub brnn package
的网站我的一小部分代码,可用于重现错误: 1. 创建数据
temporal_df = structure(list(x = c(-0.553333333333333, -3.56, -2.36333333333333,
1.48666666666667, 1.15, 0.636666666666667, -0.593333333333333,
-1.52, -2.56, -0.156666666666667, -1.09666666666667, 0.96, 0.02,
1.73333333333333, 0.34, 1.25666666666667, -0.396666666666667,
-1.15, 2.95, -1.95333333333333, -0.293333333333333, 4.33333333333333,
0.35, 1.41666666666667, 3.36666666666667, -1.54333333333333,
1.1, 0.32, 2.42, 0.34, -1.82333333333333, 1.88333333333333, 2.07666666666667,
1.96, 2.25333333333333, 0.303333333333333, 2.81333333333333,
-3.14, 0.776666666666667, 4.93, -2.16666666666667, 2.41333333333333,
2.23333333333333, 1.71666666666667, 0.623333333333333, 4.85666666666667,
0.436666666666667, 2.56333333333333, 2.21666666666667, 0.0133333333333334,
3.38333333333333, 1.51666666666667), MVA = c(7.1856694, 5.598461,
5.872606, 6.5031284, 5.6605362, 6.002758, 6.018826, 7.3664676,
5.7172694, 5.9872138, 6.07253916666667, 5.87814966666667, 5.132916,
6.26116966666667, 5.7409835, 5.75330233333333, 5.93054783333333,
5.52767016666667, 5.5299795, 5.8777515, 5.501568, 5.696386, 5.74542866666667,
5.45688033333333, 5.14158866666667, 6.22877433333333, 6.39709566666667,
6.82969366666667, 6.709905, 6.06170333333333, 6.11582483333333,
6.20273833333333, 6.709709, 6.40844766666667, 6.15858716666667,
5.9047125, 6.1760875, 6.86213666666667, 6.45906283333334, 7.02090133333333,
6.467793, 6.47158383333333, 6.76265383333333, 6.10339883333333,
7.23381633333333, 6.75162833333333, 6.59454716666667, 6.50917566666667,
6.66505483333333, 7.58141116666667, 7.15875233333333, 7.742872
)), .Names = c("x", "MVA"), row.names = c(NA, -52L), class = "data.frame")
现在拟合 brnn 模型:
#install.packages('brnn')
library(brnn)
temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-30)
在第一个建议的解决方案之后编辑:
一种可能的解决方案是设置 tol = 1e-6
。这实际上只是部分地解决了问题。我仍然在大约 1/3 的重复中得到错误。因此,我相信应该有别的东西。
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 5.01465e-19
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 7.24518e-19
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
Error in solve.default(2 * beta * H + ii(2 * alpha, npar)) :
system is computationally singular: reciprocal condition number = 1.04673e-17
数字 1e-30 比典型的 "essentially equal to zero number" 1e-16 小得多。选择该数字的基础是它接近 2.2e-32 的平方根,这是 POSIX 标准 8 字节浮点表示 "doubles" 的精度极限。我从未见过任何 R 大师使用如此小的数字。请参阅 CV.com 上的解释:How do I force the L-BFGS-B to not early stop? https://stats.stackexchange.com/questions/126251/how-do-i-force-the-l-bfgs-b-to-not-stop-early-projected-gradient-is-zero
这也是不必要的,因为如果默认容差保留在 1e-6,对 brnn
的调用(有时)运行时不会出错:
> temporal_model <- brnn(x ~ ., data = temporal_df, neurons = 2, tol = 1e-6)
Number of parameters (weights and biases) to estimate: 6
Nguyen-Widrow method
Scaling factor= 1.4
gamma= 0 alpha= 0 beta= 2.3753
当此方法运行无误时(伪随机事件),您的数据中确实没有结构,并且预测是统一的并且非常接近平均值。