如何避免 R 中的计算奇异矩阵?

机器算法验证 r 物流 线性模型 单数
2022-04-14 15:29:07

我在这里R为数据拟合逻辑回归模型(带有'scaret包)我的目标是预测希拉里或特朗普是否会赢得某个县。

相关代码:

logisticSettings <- trainControl(method = "cv", number = 10, returnResamp = "all", classProbs = TRUE, summaryFunction = twoClassSummary)
logisticModel <- train(electTrain[,2:length(electTrain)], make.names(electTrain[,1]), method = "plr", metric = "ROC", trControl = logisticSettings)

electTrain是我的训练数据集;第一列是类列,其余是特征。当我运行它时,我收到以下错误:

Error in solve.default(ddf) : 
system is computationally singular: reciprocal condition number = 9.55304e-17 

我认为这至少部分源于高度相关的数据。例如,一列是 2010 年人口,另一列是 2010 年人口估计。为了解决这个问题,我从我的训练集中删除了一些列,以便在 0.92(任意截止)以上没有相关特征。

但错误仍然存​​在。怎么了?一些想法:

  • 误差截止值仍然太高。

  • 一列大约是两个或多个其他列的线性组合。

  • 我在代码中犯了一个错误。

2个回答

手动删除高度相关(或相同)的变量是可行的,但是:

  • 随着变量的数量变得太大,它可能变得不可行
  • 手动选择变量纯粹是任意的
  • 使用因子变量,检测相关变量会变得稍微困难​​一些(除非您使用虚拟变量查看预测变量)
  • 奇异性也可能出现,因为一个变量是其他变量的线性组合,需要进一步的预处理来检测

我会推荐岭回归 / Tikhonov 正则化

  • 它使矩阵总是可逆的引入惩罚
  • 如果某些变量相同,它们将获得相同的权重
  • 使用 R 包glmnet很容易使用(而且速度很快)
  • 惩罚参数可以通过交叉验证来选择

RUser4512 有一个很好的答案 (+1)。我只想添加一些关于Matrix Condition Number的评论,我们可以用它来检查数值稳定性问题。在 R 中,函数是kappa

这是 R 中的一个示例。在此示例中,我们创建一个具有两个高度相关列的数据。x1x2请注意,它们并不相同,但非常接近。

在实验 1 中,虽然它的条件数很大。R仍然可以解决它。

> set.seed(0)
> x1=runif(1e3)*1e3
> x2=x1+runif(1e3)*1e-3
> x=cbind(x1,x2)
> y=runif(1e3)

> kappa(t(x) %*% x)
[1] 8.855766e+12

> solve(t(x) %*% x, t(x) %*%y)
        [,1]
x1 -399.9371
x2  399.9375

在实验 2 中,我们将两列的差异进一步减少了 1000 倍。如您所述,R 将产生错误。

> x[,2]=x[,2]*1e-3
> kappa(t(x) %*% x)
[1] 2.220277e+18
> solve(t(x) %*% x, t(x) %*%y)
Error in solve.default(t(x) %*% x, t(x) %*% y) : 
  system is computationally singular: reciprocal condition number = 4.49945e-19