超定线性方程组Ax=b极小L1范数求解——MATLABPython实现

超定线性方程组Ax=b极小L1范数求解——MATLABPython实现,第1张

文章目录

  • 一、前言


  • 二、问题重述


  • 二、极小模剩余向量的性质及求法


  • 三、基于基追踪准则的一种求解算法


  • 四、超定线性方程组极小 ℓ 1 \ell_1 1 范数求解Python代码


  • 五、检验与测试

    • 1. 矩阵A满秩情况
    • 2. 矩阵A列缺秩情况

  • 六、总结



一、前言

本文前半部分算法实现参考的为姚健康老师的论文,这篇论文在万方学术平台可以免费下载:http://d.g.wanfangdata.com.cn/Periodical_jxkx200701002.aspx

后半部分算法涉及到稀疏优化,我在之前的博客中介绍了实现原理并给出了代码,链接如下:稀疏优化L1范数最小化问题求解之基追踪准则(Basis Pursuit)——原理及其Python实现



二、问题重述

给定超定线性方程组 A x = b Ax=b Ax=b

A = [ a 11 a 12 . . . a 1 n a 21 a 22 . . . a 2 n . . . . . . . . . . . . a m 1 a m 2 . . . a m n ] ∈ R m × n ,   b = [ b 1 b 2 ⋮ b m ] ∈ R m × 1 A=\begin{bmatrix} a_{11}&a_{12}&...&a_{1n}\ a_{21}&a_{22}&...&a_{2n}\ ...&...&...&...\ a_{m1}&a_{m2}&...&a_{mn}\ \end{bmatrix}\in R^{m\times n},\ b=\begin{bmatrix} b_1\b_2\\vdots\b_m \end{bmatrix}\in R^{m\times 1} A=a11a21...am1a12a22...am2............a1na2n...amnRm×n, b=b1b2bmRm×1

其中 m > n ≥ 2 m>n\ge 2 m>n2,求 x = [ x 1 , x 2 , . . . , x n ] T ∈ R n × 1 x={[x_1,x_2,...,x_n]}^T\in R^{n\times 1} x=[x1,x2,...,xn]TRn×1,使得

min ⁡ ∥ A x − b ∥ 1 = min ⁡ ∑ i = 1 m ∣ ∑ j = 1 n a i j x j − b i ∣ (1) \min \left\|Ax-b\right\|_1=\min \sum_{i = 1}^{m}|\sum_{j = 1}^{n}a_{ij}x_j-b_i| \tag{1} minAxb1=mini=1mj=1naijxjbi(1)

即求超定线性方程组 A x = b Ax=b Ax=b ℓ 1 \ell_1 1 范数意义下的解,简称 ℓ 1 \ell_1 1 范数极小化问题1


定义: 设 x ∗ x^* x 为问题 ( 1 ) (1) (1) 的解,称 r ∗ = A x ∗ − b {r}^*={A}x^* - {b} r=Axb 为问题 ( 1 ) (1) (1) 的极小 ℓ 1 \ell_1 1 模剩余向量。


如果能求得极小 ℓ 1 \ell_1 1 模剩余向量 r ∗ {r}^* r,那么相容线性方程组 A x = b + r ∗ {A}x = {b} + {r}^* Ax=b+r 的解即为问题 ( 1 ) (1) (1) 的解。




二、极小模剩余向量的性质及求法

依据文献2中的说明,我们得到如下定理:

定理: 设有 2 个超定线性方程组 A x = b , B x = b {A}x={b}, {B}x={b} Ax=b,Bx=b,若存在可逆阵 P {P} P,使 B = A P {B} = {A}{P} B=AP,则这 2 个超定线性方程组的极小 ℓ 1 \ell_1 1 模剩余向量相同。


A = [ A 1 A 2 ] {A}=\begin{bmatrix} {A_1}\{A_2} \end{bmatrix} A=[A1A2]( A 1 {A_1} A1 n n n 阶可逆阵),则方程 A x = b {A}x={b} Ax=b 可以转变为式 ( 2 ) (2) (2)

[ I A 2 A 1 − 1 ] A 1 x = b (2) \begin{bmatrix} {I}\{A_2{A_1}^{-1}} \end{bmatrix}{A_1}x={b} \tag{2} [IA2A11]A1x=b(2)

设方程组 A x = b {A}x={b} Ax=b 的极小 ℓ 1 \ell_1 1 模剩余向量为 r = [ r 1 , r 2 , . . . , r m ] T {r}={[r_1, r_2, ..., r_m]}^T r=[r1,r2,...,rm]T,则由上述定理知,式 ( 2 ) (2) (2) 与方程组 A x = b {A}x={b} Ax=b 具有相同的极小 ℓ 1 \ell_1 1 模剩余向量,因而 r {r} r 也是式 ( 2 ) (2) (2) 的极小 ℓ 1 \ell_1 1 模剩余向量,记 A 1 x = y {A_1}x={y} A1x=y,故

[ I A 2 A 1 − 1 ] y = b + r (3) \begin{bmatrix} {I}\{A_2{A_1}^{-1}} \end{bmatrix}{y}={b} + {r} \tag{3} [IA2A11]y=b+r(3)

若我们令

A 2 A 1 − 1 = [ c 11 c 12 . . . c 1 n c 21 c 22 . . . c 2 n . . . . . . . . . . . . c m − n , 1 c m − n , 2 . . . c m − n , n ] ( m − n ) × n (4) {A_2{A_1}^{-1}}=\begin{bmatrix} c_{11}&c_{12}&...&c_{1n}\ c_{21}&c_{22}&...&c_{2n}\ ...&...&...&...\ c_{m-n,1}&c_{m-n,2}&...&c_{m-n,n}\ \end{bmatrix}_{(m-n)\times n} \tag{4} A2A11=c11c21...cmn,1c12c22...cmn,2............c1nc2n...cmn,n(mn)×n(4)

则极小 ℓ 1 \ell_1 1 模剩余向量 r r r 满足如下线性方程组:

{ r n + 1 − ( c 11 r 1 + c 12 r 2 + ⋯ + c 1 n r n ) = d 1 r n + 2 − ( c 21 r 1 + c 22 r 2 + ⋯ + c 2 n r n ) = d 2                          ⋯ ⋯ r m − ( c m − n , 1 r 1 + c m − n , 2 r 2 + ⋯ + c m − n , n r n ) = d m − n (5) \left\{\begin{aligned} &r_{n+1}-(c_{11}r_1+c_{12}r_2+\cdots+c_{1n}r_n)=d_1&\ &r_{n+2}-(c_{21}r_1+c_{22}r_2+\cdots+c_{2n}r_n)=d_2&\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \cdots\cdots&\ &r_{m}-(c_{m-n,1}r_1+c_{m-n,2}r_2+\cdots+c_{m-n,n}r_n)=d_{m-n}&\ \end{aligned}\right. \tag{5} rn+1(c11r1+c12r2++c1nrn)=d1rn+2(c21r1+c22r2++c2nrn)=d2                        rm(cmn,1r1+cmn,2r2++cmn,nrn)=dmn(5)

其中

A 2 A 1 − 1 [ b 1 b 2 ⋮ b n ] − [ b n + 1 b n + 2 ⋮ b m ] = [ d 1 d 2 ⋮ d m − n ] (6) {A_2{A_1}^{-1}}\begin{bmatrix} b_1\b_2\\vdots\b_n \end{bmatrix} - \begin{bmatrix} b_{n+1}\b_{n+2}\\vdots\b_m \end{bmatrix}=\begin{bmatrix} d_1\d_2\\vdots\d_{m-n} \end{bmatrix} \tag{6} A2A11b1b2bnbn+1bn+2bm=d1d2dmn(6)

具体转换过程请参考姚老师的论文。


于是要求极小 ℓ 1 \ell_1 1 模剩余向量 r {r} r,即求满足式 ( 5 ) (5) (5) { r 1 , r 2 , . . . , r m } \{r_1, r_2, ..., r_m\} {r1,r2,...,rm},使得 ∑ i = 1 m ∣ r i ∣ \sum_{i=1}^{m}|r_i| i=1mri 最小。




三、基于基追踪准则的一种求解算法

由式 ( 5 ) (5) (5) 可得,原超定线性方程组 A x = b {A}x={b} Ax=b 的极小 ℓ 1 \ell_1 1 模剩余向量可由如下约束不可微优化问题求得:

{ m i n ∑ i = 1 m ∣ z i ∣ s . t .      z n + 1 − ( c 11 z 1 + c 12 z 2 + ⋯ + c 1 n z n ) = d 1 , z n + 2 − ( c 21 z 1 + c 22 z 2 + ⋯ + c 2 n z n ) = d 2 ,                          ⋯ ⋯ z m − ( c m − n , 1 z 1 + c m − n , 2 z 2 + ⋯ + c m − n , n z n ) = d m − n (P) \left\{\begin{aligned} &min\sum_{i=1}^{m}|z_i|\ s.t.\ \ \ \ &z_{n+1}-(c_{11}z_1+c_{12}z_2+\cdots+c_{1n}z_n)=d_1,\ &z_{n+2}-(c_{21}z_1+c_{22}z_2+\cdots+c_{2n}z_n)=d_2,\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \cdots\cdots\ &z_{m}-(c_{m-n,1}z_1+c_{m-n,2}z_2+\cdots+c_{m-n,n}z_n)=d_{m-n} \end{aligned}\right. \tag{P} s.t.    mini=1mzizn+1(c11z1+c12z2++c1nzn)=d1,zn+2(c21z1+c22z2++c2nzn)=d2,                        zm(cmn,1z1+cmn,2z2++cmn,nzn)=dmn(P)

记问题 ( P ) (P) (P) 的最优解 z ∗ = [ z 1 ∗ , z 2 ∗ , . . . , z m ∗ ] T {z}^*={[z_1^*, z_2^*, ..., z_m^*]}^T z=[z1,z2,...,zm]T,方程组 A x = b + z ∗ {A}x={b}+{z}^* Ax=b+z 为原方程的一个相容线性方程组,其解 x ∗ {x}^* x 即为问题 ( 1 ) (1) (1) 的解:

x ∗ = A 1 − 1 [ b 1 b 2 ⋮ b n ] + A 1 − 1 [ z 1 ∗ z 2 ∗ ⋮ z n ∗ ] (7) {x}^*={{A_1}^{-1}}\begin{bmatrix} b_1\\b_2\\\vdots\\b_n \end{bmatrix} + {{A_1}^{-1}}\begin{bmatrix} z_1^*\\z_2^*\\\vdots\\z_n^* \end{bmatrix} \tag{7} x=A11b1b2bn+A11z1z2zn(7)

在问题 ( P ) (P) (P) 中,若我们定义 C ∈ R ( m − n ) × m {C} \in {R}^{(m-n)\times m} CR(mn)×m

C = [ − c 11 − c 12 ⋯ − c 1 n 1 0 ⋯ 0 − c 21 − c 22 ⋯ − c 2 n 0 1 ⋯ 0 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ − c m − n , 1 − c m − n , 2 ⋯ − c m − n , n 0 0 ⋯ 1 ] (8) {C}=\begin{bmatrix} -c_{11}&-c_{12}&\cdots&-c_{1n}&1&0&\cdots&0\ -c_{21}&-c_{22}&\cdots&-c_{2n}&0&1&\cdots&0\ \cdots&\cdots&\cdots&\cdots&\cdots&\cdots&\cdots&\cdots\ -c_{m-n,1}&-c_{m-n,2}&\cdots&-c_{m-n,n}&0&0&\cdots&1\ \end{bmatrix} \tag{8} C=c11c21cmn,1c12c22cmn,2c1nc2ncmn,n100010001(8)

则问题 ( P ) (P) (P) 变成了如下问题:

m i n ∑ i = 1 m ∣ z i ∣ ,   s . t .   C z = d . (Q) min\sum_{i=1}^{m}|z_i|,\ s.t.\ {C}{z}={d}. \tag{Q} mini=1mzi, s.t. Cz=d.(Q)

对于极小 ℓ 1 \ell_1 1 模剩余向量 z {z} z,考虑到我们的求解应当尽可能逼近精确解,即极小 ℓ 1 \ell_1 1 模剩余向量 z {z} z 中的元素应当尽可能为0。


这样问题 ( Q ) (Q) (Q) 的形式又回到了 ℓ 1 \ell_1 1 范数最小化问题中的稀疏优化问题。


参考我的这篇博客求解上述稀疏优化问题:稀疏优化L1范数最小化问题求解之基追踪准则(Basis Pursuit)——原理及其Python实现



四、超定线性方程组极小 ℓ 1 \ell_1 1 范数求解Python代码

采用 Python 中 scipy 模块内置的 linprog 函数求解线性方程组,编写代码如下:

import numpy as np 
from scipy import optimize as op

def OLE_linprog(A, b):
    '''
    Ax = b (Given A & b, try to derive x)
    
    Parameters
    ----------
    A : matrix like.
    b : array like.

    Returns
    -------
    x : array
        Minimal L1 norm solution of the system of equations.
        
    Reference
    ---------
    YAO Jian-kang. An Algorithm for Minimizing l1-Norm to Overdetermined Linear Eguations[J]. 
    JIANGXI SCE7NICE, 2007, 25(1): 1-4.(Available at: 
    http://d.g.wanfangdata.com.cn/Periodical_jxkx200701002.aspx)
        
    Version: 1.0 writen by z.q.feng @2022.03.13
    '''
    A, b = np.array(A), np.array(b)
    if np.size(A, 0) < np.size(A, 1):
        raise ValueError('Matrix A rows must greater than columns!')
    m, n = A.shape
    # Trans A into two matrix(n x n and (m - n) x n)
    A1, A2 = A[:n, :], A[n:, :]
    if np.linalg.matrix_rank(A) >= n:
        # inverse of A1 
        A1_ = np.linalg.inv(A1)
    else:
        # Generalized inverse of A1 
        A1_ = np.linalg.pinv(A1)
    # c_ij = A2 * A1_
    c = np.dot(A2, A1_)
    # r(n+1:m) = A2*inv(A1)*r(1:n) + d
    d = np.dot(c, b[:n]) - b[n:]
    # Basic-Pursuit, target function = sum(u, v)
    t = np.ones([2 * m, 1])
    # Aeq_ = [c I(m-n)]
    Aeq_ = np.hstack([-c, np.eye(m - n, m - n)])
    # Aeq[u v] = Aeq_ * (u - v)
    Aeq = np.hstack([Aeq_, -Aeq_])
    # u, v > 0
    bounds = [(0, None) for i in range(2 * m)]
    # r0 = [u; v]
    r0 = op.linprog(t, A_eq = Aeq, b_eq = d, bounds = bounds,
                    method='revised simplex')['x']
    # Minimal L1-norm residual vector, r = u - v
    r = np.array([r0[:m] - r0[m:]])
    # Solving compatible linear equations Ax = b + r
    # Generalized inverse solution
    x = np.linalg.pinv(A).dot(b + r.T)
    return x

采用 MATLAB 求解的由于篇幅问题我就不放了,私信我。




五、检验与测试 1. 矩阵A满秩情况

对于线性方程 A x = b {A}x = {b} Ax=b,我们通过产生给定的 A {A} A u {u} u,并令 b = A ∗ u {b} = {A} * {u} b=Au,则可以认为 u {u} u 即为问题 min ⁡   ∥ A x − b ∥ 1 \min\ \left\|{A}x-{b}\right\|_1 min Axb1 的最优解。


接着我们利用上述函数求解得到其经验解 u ∗ {u}^* u,利用 ∥ u ∗ − u ∥ 2 \left\|{u}^*-{u}\right\|_2 uu2 定义其恢复残差,并绘图确定求解准确性。


if __name__ == '__main__':
    m, n = 256, 128
    # 256x128矩阵,每个元素服从Gauss随机分布
    A = np.random.randn(m, n)
    # 128x1矩阵,每个元素服从Gauss随机分布
    # b = A * u, 则 Au - b = 0,u 即为我们要求的精确解
    u = np.random.randn(n, 1)
    b = np.dot(A, u)
    alpha = OLE_linprog(A, b)
    # 恢复残差 
    print('\n恢复残差:', np.linalg.norm(alpha - u, 2))
    # 绘图
    plt.figure(figsize = (8, 6))
    # 绘制原信号
    plt.plot(u, 'r', linewidth = 2, label = 'Original')
    # 绘制恢复信号
    plt.plot(alpha, 'b--', linewidth = 2, label = 'Recovery')
    plt.grid() 
    plt.legend()
    plt.show()

得到恢复残差为6.0407e-14,恢复信号图如图所示(信号随机生成,每次结果均不一样)。


2. 矩阵A列缺秩情况

根据式 ( 2 ) (2) (2) 可以看出,若矩阵 A {A} A 行不满秩,即 n < r a n k ( A 1 ) < m n < rank({A_1}) < m n<rank(A1)<m,我们的方法是不需要做对应改变的,而若矩阵 A {A} A 列缺秩,则需要使用矩阵 A 1 {A_1} A1 的Moore-Penrose逆矩阵 A 1 † {A_1^\dagger} A1 替代 A 1 − 1 {{A_1}^{-1}} A11 在式 ( 2 ) (2) (2) 中构造 b {b} b


下面我们通过代码让矩阵 A {A} A 列秩亏缺1:

A(:, n) = zeros(m, 1);

运行代码,得到恢复残差为0.2551,恢复信号图如图所示(信号随机生成,每次结果均不一样)。


可以看到,虽然误差增大了,但是还在允许范围内。




六、总结

目前,求解问题 ( 1 ) (1) (1) 的方法已有不少,主要有:

  • 线性规划方法;
  • 投影下降法;
  • 有效集法;
  • 区间方法等。


上述方法各有优缺点,如线性规划方法使规模扩大,投影下降算法过于复杂,不易被工程技术人员掌握,有效集法较其它方法直观,算法简单,区间方法过于复杂,无最优解区间的检验比较麻烦。


本文利用极小 ℓ 1 \ell_1 1 模剩余向量将问题 ( 1 ) (1) (1) 转化为先求一个约束不可微最优化问题,再解一个相容线性方程组,算法具有不扩大规模、简单、易于 *** 作的优点。



  1. 姚健康. 超定线性方程组极小 ℓ1 范数解的一个算法[J/OL]. 江西科学, 2007
    (1): 1-3. http://d.g.wanfangdata.com.cn/Periodical_jxkx200701002.aspx. ↩︎

  2. 王嘉松,权日光. 不相容线性方程组极小极大解的一种新算法[J]. 1996: 04. ↩︎

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/570967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存