Julia中的线性回归和矩阵除法

时间:2018-07-25 10:52:51

标签: julia linear-algebra

OLS的著名公式是(X'X)^(-1)X'y,其中XnxK,而ynx1

在Julia中实现此功能的一种方法是(X'*X)\X'*y

但是我发现X\y给出的输出几乎相同,只是微小的计算误差。

他们是否总是计算相同的东西(只要n>k)?如果是这样,我应该使用哪一个?

3 个答案:

答案 0 :(得分:7)

X为正方形时,有一个唯一的解决方案,而LU-factorization (with pivoting)是一种数值稳定的计算方法。这就是反斜杠在这种情况下使用的算法。

在大多数回归问题中,X不为平方时,则没有唯一解,但有唯一的最小二乘解。用于解决Xβ = y的{​​{3}}方法是一种用于生成最小二乘解的数值稳定方法,在这种情况下,X\y使用QR分解,从而给出了OLS解。

注意单词在数字上是稳定的。尽管(X'*X)\X'*y在理论上总是会提供与反斜杠相同的结果,但实际上反斜杠(使用正确的分解因子选择)会更加精确。这是因为分解算法被实现为QR factorization。由于进行(X'*X)\X'*y时要累积的浮点错误会有所变化,因此不建议您将此形式用于任何实际的数值运算。

相反,(X'*X)\X'*y在某种程度上等效于SVD因数分解,这是数值上最稳定的算法,但也是最昂贵的(实际上,它基本上是在写出numerically stable,这就是{{ 3}}用于求解线性系统。要使用枢轴SVD直接进行SVD​​分解,请在v0.6上执行svdfact(X) \ y或在v0.7上执行svd(X) \ y。直接执行此操作比(X'*X)\X'*y更稳定。请注意,qrfact(X) \ yqr(X) \ y(v0.7)适用于QR。 Moore-Penrose pseudoinverse,以获取有关所有选择的更多详细信息。

答案 1 :(得分:6)

根据文档,X\y的结果为(没有使用\(A, B)X的符号y

  

对于矩形A,结果是最小范数最小二乘解

我猜这是您的情况,假设您假设n>k(因此您的矩阵不是正方形的)。因此,您可以放心使用X\y。实际上,使用它比使用标准公式更好,因为即使X的等级小于min(n,k)也会得到结果,而标准公式(X'*X)^(-1)*X'*y将失败或产生数值不稳定的结果如果X'*X几乎是单数。

如果X将是正方形(这不是您的情况),那么我们在文档中会有一些不同的规则:

  

对于输入矩阵A和B,当A为正方形时,结果X使得A * X == B

这意味着\算法将在矩阵为奇数时产生错误,或者在矩阵几乎为奇数时产生数值不稳定的结果(实际上,lu函数通常是内部调用密集矩阵可能会抛出SingularException)。

如果您想使用全面解决方案(用于平方和非平方矩阵),则可以使用qr(X, Val(true)) \ y

答案 2 :(得分:0)

简短的回答:不,请使用第一个(众所周知的)。

长答案:

线性回归模型为Xβ = y,很容易得出β = X \ y,这是您的第二种方法。但是,在大多数情况下(X不可逆时),这是错误的,因为您不能简单地将乘法X^-1留在左边。正确的方法是求解β = argmin{‖y - Xβ‖^2},这导致第一种方法。

要显示它们并不总是相同,请简单构造一个X不可逆的情况:

julia> X = rand(10, 10)
10×10 Array{Float64,2}:
 0.938995  0.32773   0.740556  0.300323   0.98479    0.48808    0.748006   0.798089  0.864154  0.869864
 0.973832  0.99791   0.271083  0.841392   0.743448   0.0951434  0.0144092  0.785267  0.690008  0.494994
 0.356408  0.312696  0.543927  0.951817   0.720187   0.434455   0.684884   0.72397   0.855516  0.120853
 0.849494  0.989129  0.165215  0.76009    0.0206378  0.259737   0.967129   0.733793  0.798215  0.252723
 0.364955  0.466796  0.227699  0.662857   0.259522   0.288773   0.691278   0.421251  0.593215  0.542583
 0.126439  0.574307  0.577152  0.664301   0.60941    0.742335   0.459951   0.516649  0.732796  0.990509
 0.430213  0.763126  0.737171  0.433884   0.85549    0.163837   0.997908   0.586575  0.257428  0.33239
 0.28398   0.162054  0.481452  0.903363   0.780502   0.994575   0.131594   0.191499  0.702596  0.0967979
 0.42463   0.142     0.705176  0.0481886  0.728082   0.709598   0.630134   0.139151  0.423227  0.942262
 0.197805  0.526095  0.562136  0.648896   0.805806   0.168869   0.200355   0.557305  0.69514   0.227137

julia> y = rand(10, 1)
10×1 Array{Float64,2}:
 0.7751785556478308
 0.24185992335144801
 0.5681904264574333
 0.9134364924569847
 0.20167825754443536
 0.5776727022413637
 0.05289808385359085
 0.5841180308242171
 0.2862768657856478
 0.45152080383822746

julia> ((X' * X) ^ -1) * X' * y
10×1 Array{Float64,2}:
 -0.3768345891121706
  0.5900885565174501
 -0.6326640292669291
 -1.3922334538787071
  0.06182039005215956
  1.0342060710792016
  0.045791973670925995
  0.7237081408801955
  1.4256831037950832
 -0.6750765481219443

julia> X \ y
10×1 Array{Float64,2}:
 -0.37683458911228906
  0.5900885565176254
 -0.6326640292676649
 -1.3922334538790346
  0.061820390052523294
  1.0342060710793235
  0.0457919736711274
  0.7237081408802206
  1.4256831037952566
 -0.6750765481220102

julia> X[2, :] = X[1, :]
10-element Array{Float64,1}:
 0.9389947787349187
 0.3277301697101178
 0.7405555185711721
 0.30032257202572477
 0.9847899425069042
 0.48807977638742295
 0.7480061513093117
 0.79808859136911
 0.8641540973071822
 0.8698636291189576

julia> ((X' * X) ^ -1) * X' * y
10×1 Array{Float64,2}:
  0.7456524759867015
  0.06233042922132548
  2.5600126098899256
  0.3182206475232786
 -2.003080524452619
  0.272673133766017
 -0.8550165639656011
  0.40827327221785403
  0.2994419115664999
 -0.37876151249955264

julia> X \ y
10×1 Array{Float64,2}:
  3.852193379477664e15
 -2.097948470376586e15
  9.077766998701864e15
  5.112094484728637e15
 -5.798433818338726e15
 -2.0446050874148052e15
 -3.300267174800096e15
  2.990882423309131e14
 -4.214829360472345e15
  1.60123572911982e15