# lscov


存在已知协方差的最小二乘解

函数库: TyMath

# 语法

x = lscov(A,B)
x = lscov(A,B,w)
x = lscov(A,B,V)
x = lscov(A,B,V,alg)
x,stdx = lscov(...)
x,stdx,mse = lscov(...) 
x,stdx,mse,S = lscov(...)

# 说明

x = lscov(A,B) 对于线性系统 返回最小化误差平方和 的最小二乘解,其中 ,A 是矩阵,而 b 是列向量。如果 b 是矩阵,则 x 和 b 的对应列分别满足方程。示例


x = lscov(A,B,w) 返回最小化 的加权最小二乘解,其中 示例


x = lscov(A,B,V) 返回最小化 的广义最小二乘解,其中 且 b 的协方差矩阵与 V 成正比。示例


x = lscov(A,B,V,alg) 指定求解线性系统的算法。默认情况下,lscov 使用 C 的 Cholesky 分解来计算 x。将 alg 指定为 "orth",以使用 C 的正交分解。如果 C 不可逆,则 lscov 使用正交分解,而不管 alg 的值如何。以上用法可以选用更高效的 lscov_core 函数。


x,stdx = lscov(...) 返回 x 的估计标准误差。标准误差是 x 的标准差的估计值。您可以使用上述语法中的任何输入参量组合。该用法可以选用更高效的 lscov_basic 函数。


x,stdx,mse = lscov(...) 返回均方误差。均方误差与函数最小化的值成正比 。该用法可以选用更高效的 lscov_basic 函数。示例


x,stdx,mse,S = lscov(...) 返回 x 的估计协方差矩阵。仅当 b 是列向量时,才能使用此语法。示例

# 示例

普通最小二乘法

为线性系统 A*x = b 创建一个矩阵 A 和向量 b。使用 lscov 计算线性系统的最小二乘解。指定三个输出参量以返回该解、其估计的标准误差和均方误差。

using TyMath
x1 = [0.2,0.5,0.6,0.8,1.0,1.1]
x2 = [0.1,0.3,0.4,0.9,1.1,1.4]
A = [ones(size(x1)) x1 x2]
b = [0.17,0.26 ,0.28,0.23,0.27,0.34]
x,stdx,mse = lscov(A,b)
x = 3-element Vector{Float64}:
  0.12030264279624908
  0.3283887468030691
 -0.13120204603580593

stdx = 3×1 Matrix{Float64}:
 0.06427651122587535
 0.22668939177707886
 0.14878307645900174

mse  = 0.0015455953395851077

向 b 添加噪声以创建采样矩阵,并使用反斜杠运算符 (\) 计算矩阵的最小二乘估计值。计算结果中每行的标准误差。

using TyStatistics
rng = MT19937ar(5489)
B = b .+ randn(rng,6,10000);
X = A\B;
s1 = std(X,0,2)
s1 = 3×1 Matrix{Float64}:
3×1 Matrix{Float64}:
 1.6429016204873093
 5.779447708142414
 3.7905766221248482

将使用反斜杠获得的标准误差与使用 lscov 获得的标准误差进行比较。按照 mse 的平方根重新缩放标准误差 stdx 以说明由 lscov 执行的缩放。X 的标准误差通常与通过 lscov 计算的标准误差相符。重新缩放后的标准误差表明,如果 b 的各元素具有均匀的噪声,则 x 的第二个元素受到的影响比第一个元素大得多。

s2 = stdx/sqrt(mse)
s2 = 3×1 Matrix{Float64}:
3×1 Matrix{Float64}:
 1.6349497021496562
 5.766114969494821
 3.7844749489706246
加权最小二乘法

为问题 A*x = b 创建 A 矩阵和 b 向量。创建一个相对观测值权重向量,并计算加权最小二乘解。

using TyMath
x1 = [0.2,0.5,0.6,0.8,1.0,1.1]
x2 = [0.1,0.3,0.4,0.9,1.1,1.4]
A = [ones(size(x1)) x1 x2]
b = [0.17,0.26,0.28,0.23,0.27,0.34]
w = [1,1,1,1,1,0.1];
x1,stdx1,mse1 = lscov(A,b,w)
x1 = 3-element Vector{Float64}:
  0.1045635719076363
  0.461425697039379
 -0.2620580626616844

stdx1 = 3×1 Matrix{Float64}:
 0.030864259364988104
 0.11515846970379404
 0.08142933483861833

mse1 = 0.00034741464660981744

计算同一问题的普通最小二乘解,并绘制这两个解。对于前五个点,加权最小二乘解比普通最小二乘解更接近 b。由于加权最小二乘解的第六个元素向下加权,因此其解的第六个点离 b 更远。

using TyPlot
x2,stdx2,mse2 = lscov(A,b);
x = 1:6;
plot(x,b,"o",x,A*x1,"o",x,A*x2,"o")
legend("b","Weighted","Ordinary")
广义最小二乘

为问题 A*x = b 创建 A 矩阵和 b 向量。创建一个协方差缩放矩阵,并计算广义最小二乘解。

using TyMath
a1 = [0.2, 0.5, 0.6, 0.8, 1.0, 1.1]; 
a2 = [0.1, 0.3, 0.4, 0.9, 1.1, 1.4]; 
A = [ones(size(a1)) a1 a2]; 
b = [0.17; 0.26; 0.28; 0.23; 0.27; 0.24];
C = 0.2*ones(size(a1)) .+ 0.8*diagm(ones(size(a1)));
x,stdx,mse = lscov(A,b,C)
x = 3-element Vector{Float64}:
  0.10184569479965878
  0.4843989769820973
 -0.2846547314578009

stdx = 3×1 Matrix{Float64}:
 0.006110463002209751
 0.020608126525188782
 0.013525734223545473

mse = 1.5966894003978044e-5
估计协方差矩阵
using TyMath
a1 = [0.2, 0.5, 0.6, 0.8, 1.0, 1.1]; 
a2 = [0.1, 0.3, 0.4, 0.9, 1.1, 1.4]; 
A = [ones(size(a1)) a1 a2]; 
b = [0.17, 0.26, 0.28, 0.23, 0.27, 0.24];
x,stdx,mse,S = lscov(A,b)
x = 3-element Vector{Float64}:
  0.10184569479965923
  0.4843989769820972
 -0.28465473145780085

stdx = 3×1 Matrix{Float64}:
 0.005843319202352235
 0.02060812652518874
 0.013525734223545452

mse =  1.2773515203182404e-5

S = 3×3 Matrix{Float64}:
  3.41444e-5  -0.00010748    6.17441e-5
 -0.00010748   0.000424695  -0.000271151
  6.17441e-5  -0.000271151   0.000182945

系数标准误差等于以下协方差矩阵的对角线上值的平方根。

sqrt.(diag(S))
ans = 3-element Vector{Float64}:
 0.005843319202352235
 0.02060812652518874
 0.013525734223545452

# 输入参数

A, B — 操作数
向量 | 矩阵

操作数,指定为向量或矩阵。A 和 B 必须具有相同的行数。如果 B 是矩阵,则 lscov 为 B 的每列返回一个解。

数据类型: Float16 | Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | Int128 | Complex

复数支持:

w — 相对权重
非负实数列向量

相对权重,指定为非负实数列向量,行数与 A 相同。权重通常是计数或逆方差。当指定此参量时,lscov 返回线性系统 的加权最小二乘解,并使 最小化,其中

数据类型: Float16 | Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | Int128

复数支持:

V — 缩放协方差矩阵
实数方阵

缩放协方差矩阵,指定为实对称矩阵(如果是复数矩阵,则为埃尔米特矩阵)。V 可以是正定矩阵,也可以是半定矩阵。如果 V 是正定矩阵,则 lscov 返回线性系统 的最小二乘解,并使 最小化,其中 ,协方差矩阵与 V 成比例。

如果 V 是半正定矩阵,则 lscov 返回 的解,其中 和 e 是此系统有解的所有向量 e 中具有最小范数的向量。仅当 b 在 [A T] 的列空间中时,此系统才有解。

数据类型: Float16 | Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | Int128

复数支持:

alg — 最小二乘求解算法
"chol" (默认) | "orth"
最小二乘求解算法,指定为以下值之一:
  • "chol" —— 使用 C 的 Cholesky 分解,并对该因子求逆以将问题变换为普通最小二乘法;

  • "orth" —— 使用正交分解算法。这种算法的计算成本更高,但当 C 是病态或奇异矩阵时,该算法更适用。

默认情况下,lscov 函数使用 Cholesky 分解。但是,如果 lscov 确定 C 是半定矩阵,则该函数使用正交分解算法,而不管 alg 的值如何。

数据类型: Float16 | Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | Int128

复数支持:

# 输出参数

x — 解
向量 | 矩阵

解,以向量或矩阵形式返回。如果 A 是 m×n 矩阵,b 是 m×p 矩阵,那么 x 是 n×p 矩阵,包括 p 为 1 的情况。如果 A 是欠定矩阵,则有多个可能的 x。在这种情况下,x 的一些元素限制为零以获得唯一定义的解。

如果 A 具有满存储,则 x 也具有满存储。如果您指定了缩放协方差矩阵,当 A、b 和 C 是稀疏矩阵时,则 x 是稀疏矩阵。否则,如果 A 和 b 是稀疏矩阵,则 x 是稀疏矩阵。

stdx — 估计的标准误差
向量

估计的标准误差,以向量形式返回。如果缩放协方差矩阵描述 b 中的变化,则标准误差是 x 的标准差的估计值。如果 A 是欠定矩阵,则 stdx 在对应于 x 的受限零元素的元素中包含零。

lscov 基于均方误差缩放 stdx,但如果已知 C 完全为 b 的协方差矩阵,则缩放是不必要的。在这种情况下,要获得适当的估计值,请按 sqrt(1/mse) 缩放 stdx。

mse — 均方误差
标量

估计的标准误差,以向量形式返回。如果缩放协方差矩阵描述 b 中的变化,则标准误差是 x 的标准差的估计值。如果 A 是欠定矩阵,则 stdx 在对应于 x 的受限零元素的元素中包含零。

lscov 基于均方误差缩放 stdx,但如果已知 C 完全为 b 的协方差矩阵,则缩放是不必要的。在这种情况下,要获得适当的估计值,请按 sqrt(1/mse) 缩放 stdx。

S — 估计的协方差矩阵
矩阵

估计的协方差矩阵。仅当 b 是列向量时,该函数才返回 S。如果 A 是欠定矩阵,则 S 在对应于 x 的受限零元素的行和列中包含零。

lscov 基于均方误差缩放 S,但如果已知 C 完全为 b 的协方差矩阵,则缩放是不必要的。在这种情况下,要获得适当的估计值,请按 1/mse 缩放 S。

# 算法

当 m×n 矩阵 A 和 m×m 矩阵 C 在广义最小二乘问题中满秩时,这些标准公式表示在 m 大于或等于 n 时 lscov 的输出。

当 m 小于 n 时,均方误差为 0。

对于加权最小二乘法,当用 diag(1./w) 代替 C 时,标准公式适用。对于普通最小二乘法,用单位矩阵代替 C。

lscov 函数使用的方法比标准公式更快也更稳定,而且适用于处理秩亏情况。例如,lscov 计算乔列斯基分解 ,然后改用 A\b 求解最小二乘问题的相同算法求解最小二乘问题 (R'\A)*x = (R'\b).

# 另请参阅

inv | linsolve | lscov_core | lscov_basic