# 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) 对于线性系统
x = lscov(A,B,w) 返回最小化
x = lscov(A,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 是半正定矩阵,则 lscov 返回
数据类型: 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 的输出。
对于加权最小二乘法,当用 diag(1./w) 代替 C 时,标准公式适用。对于普通最小二乘法,用单位矩阵代替 C。
lscov 函数使用的方法比标准公式更快也更稳定,而且适用于处理秩亏情况。例如,lscov 计算乔列斯基分解
# 另请参阅
inv | linsolve | lscov_core | lscov_basic