当前位置: 首页 > news >正文

7.4 SVD 的几何背景

一、SVD 的几何解释

SVD 将矩阵分解成三个矩阵的乘积: ( 正交矩阵 ) × ( 对角矩阵 ) × ( 正交矩阵 ) (\pmb{正交矩阵})\times(\pmb{对角矩阵})×(\pmb{正交矩阵}) (正交矩阵)×(对角矩阵)×(正交矩阵),用几何语言表述其几何背景: ( 旋转 ) × ( 伸缩 ) × ( 旋转 ) (\pmb{旋转})\times(\pmb{伸缩})\times(\pmb{旋转}) (旋转)×(伸缩)×(旋转). U Σ V T x U\Sigma V^T\boldsymbol x UΣVTx 首先旋转得到 V T x V^T\boldsymbol x VTx,然后 Σ \Sigma Σ 伸缩该向量得到 Σ V T x \Sigma V^T\boldsymbol x ΣVTx,最后矩阵 U U U 旋转得到 A x = U Σ V T x A\boldsymbol x=U\Sigma V^T\boldsymbol x Ax=UΣVTx,下面是图片:

在这里插入图片描述
诚然,上图仅适用于某些 2 × 2 2\times2 2×2 的矩阵,并非所有 2 × 2 2\times2 2×2 的矩阵都适用,因为 U U U V V V 并不包含反射 —— 这三个矩阵的行列式都大于 0 0 0. 此处的矩阵 A A A 一定可逆,因为这三个矩阵均可逆: [ a b c d ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ σ 1 σ 2 ] [ cos ⁡ ϕ sin ⁡ ϕ − sin ⁡ ϕ cos ⁡ ϕ ] = U Σ V T ( 7.4.1 ) \begin{bmatrix}a&b\\c&d\end{bmatrix}=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\kern 7pt\cos\theta\end{bmatrix}\begin{bmatrix}\sigma_1\\&\sigma_2\end{bmatrix}\begin{bmatrix}\kern 7pt\cos\phi&\sin\phi\\-\sin\phi&\cos\phi\end{bmatrix}=U\Sigma V^T\kern20pt(7.4.1) [acbd]=[cosθsinθsinθcosθ][σ1σ2][cosϕsinϕsinϕcosϕ]=UΣVT(7.4.1)由矩阵 A A A 中的四个元素 a , b , c , d a,b,c,d a,b,c,d 得到 SVD 中的四个数 θ , σ 1 , σ 2 , ϕ \theta,\sigma_1,\sigma_2,\phi θ,σ1,σ2,ϕ.
由这张图导出矩阵代数中的三个重要概念:

  1. 矩阵范数 ∣ ∣ A ∣ ∣ ||\pmb{A}|| ∣∣A∣∣ —— 矩阵最大的增长因子.
  2. 极分解 A = Q S \pmb{A=QS} A=QS —— 正交矩阵 Q Q Q 乘正定矩阵 S S S.
  3. 伪逆 A + \pmb{A^+} A+ —— 当 A A A 不可逆时的最佳逆矩阵.

二、矩阵范数

如果要在 Figure 7.5 中选择一个关键的数字,那么就是 σ 1 \sigma_1 σ1,这个数字是任意向量 x \boldsymbol x x 的最大增长因子。观察 Figure 7.5 中左边的向量 v 1 \boldsymbol v_1 v1,可以看到它先旋转至 ( 1 , 0 ) (1,0) (1,0),然后伸缩成 ( σ 1 , 0 ) (\sigma_1,0) (σ1,0),最后再旋转至 σ 1 u 1 \sigma_1\boldsymbol u_1 σ1u1,表达式 A v 1 = σ 1 u 1 A\boldsymbol v_1=\sigma_1\boldsymbol u_1 Av1=σ1u1 就是奇异值分解,这个最大的奇异值 σ 1 \sigma_1 σ1 是矩阵 A A A 的 “范数(norm)”.

范数 ∣ ∣ A ∣ ∣ 是 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ 的最大值, ∣ ∣ A ∣ ∣ = max ⁡ x ≠ 0 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ = σ 1 ( 7.4.2 ) 范数\, ||A||\,是\,\frac{||A\boldsymbol x||}{||\boldsymbol x||}\,的最大值,{\color{blue}||A||=\underset{\boldsymbol x\neq\boldsymbol 0}{\max}\frac{||A\boldsymbol x||}{||\boldsymbol x||}=\sigma_1}\kern 20pt(7.4.2) 范数∣∣A∣∣∣∣x∣∣∣∣Ax∣∣的最大值,∣∣A∣∣=x=0max∣∣x∣∣∣∣Ax∣∣=σ1(7.4.2)

MATLAB 中使用 norm ( x ) \textrm{norm}(\boldsymbol x) norm(x) 得到向量 x \boldsymbol x x 长度,使用 norm ( x ) \textrm{norm}(\boldsymbol x) norm(x) 得到矩阵 A A A 的范数。数学符号是双竖线: ∣ ∣ x ∣ ∣ ||\boldsymbol x|| ∣∣x∣∣ ∣ ∣ A ∣ ∣ ||A|| ∣∣A∣∣,这里 ∣ ∣ x ∣ ∣ ||\boldsymbol x|| ∣∣x∣∣ 的意思是向量的长度: ∣ ∣ x ∣ ∣ 2 = ∣ x 1 ∣ 2 + ∣ x 2 ∣ 2 + ⋯ + ∣ x n ∣ 2 ||\boldsymbol x||^2=|x_1|^2+|x_2|^2+\cdots+|x_n|^2 ∣∣x2=x12+x22++xn2,矩阵的范数也来源于向量范数,当 x = v 1 \boldsymbol x=\boldsymbol v_1 x=v1 A x = σ 1 u 1 A\boldsymbol x=\sigma_1\boldsymbol u_1 Ax=σ1u1,则 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ = σ 1 \displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||}=\sigma_1 ∣∣x∣∣∣∣Ax∣∣=σ1,即最大的比值是 ∣ ∣ A ∣ ∣ ||A|| ∣∣A∣∣.
由定义直接得到数值 norm ( A ) \textrm{norm}(A) norm(A) 的两条重要性质:

三角不等式 ∣ ∣ A + B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ + ∣ ∣ B ∣ ∣ 乘积不等式 ∣ ∣ A B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ ( 7.4.3 ) \pmb{三角不等式}\kern 5pt{\color{blue}||A+B||\leq||A||+||B||}\kern 20pt\pmb{乘积不等式}\kern 5pt{\color{blue}||AB||\leq||A||\,||B||}\kern 15pt(7.4.3) 三角不等式∣∣A+B∣∣∣∣A∣∣+∣∣B∣∣乘积不等式∣∣AB∣∣∣∣A∣∣∣∣B∣∣(7.4.3)

由定义(7.4.2)可知,对于任意向量 x \boldsymbol x x 都有 ∣ ∣ A x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ x ∣ ∣ ||A\boldsymbol x||\leq||A||\,||\boldsymbol x|| ∣∣Ax∣∣∣∣A∣∣∣∣x∣∣,然后再由向量的三角不等式推出矩阵的三角不等式: 对于向量 ∣ ∣ ( A + B ) x ∣ ∣ ≤ ∣ ∣ A x ∣ ∣ + ∣ ∣ B x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ x ∣ ∣ + ∣ ∣ B ∣ ∣ ∣ ∣ x ∣ ∣ \pmb{对于向量}\kern 20pt||(A+B)\boldsymbol x||\le||A\boldsymbol x||+||B\boldsymbol x||\le||A||\,||\boldsymbol x||+||B||\,||\boldsymbol x|| 对于向量∣∣(A+B)x∣∣∣∣Ax∣∣+∣∣Bx∣∣∣∣A∣∣∣∣x∣∣+∣∣B∣∣∣∣x∣∣然后同时除以 ∣ ∣ x ∣ ∣ ||\boldsymbol x|| ∣∣x∣∣,遍历所有的 x \boldsymbol x x 取最大值,即得: ∣ ∣ A + B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ + ∣ ∣ B ∣ ∣ ||A+B||\le||A||+||B|| ∣∣A+B∣∣∣∣A∣∣+∣∣B∣∣.
乘积不等式可以由 ∣ ∣ A B x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ B x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ ∣ ∣ x ∣ ∣ ||AB\boldsymbol x||\le||A||\,||B\boldsymbol x||\le||A||\,||B||\,||\boldsymbol x|| ∣∣ABx∣∣∣∣A∣∣∣∣Bx∣∣∣∣A∣∣∣∣B∣∣∣∣x∣∣ 快速得到,同样除以 ∣ ∣ x ∣ ∣ ||\boldsymbol x|| ∣∣x∣∣,再遍历所有的 x \boldsymbol x x 取最大值,结果就是 ∣ ∣ A B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ ||AB||\le||A||\,||B|| ∣∣AB∣∣∣∣A∣∣∣∣B∣∣.

例1】秩一矩阵 A = u v T A=\boldsymbol u\boldsymbol v^T A=uvT 是我们能得到的最基础的矩阵,它有一个非零的特征值 λ 1 \lambda_1 λ1 和一个非零的奇异值 σ 1 \sigma_1 σ1,此外,它的特征向量是 u \boldsymbol u u,左和右奇异向量是 u \boldsymbol u u v \boldsymbol v v. 特征向量 A u = ( u v T ) u = u ( v T u ) = λ 1 u 所以 λ 1 = v T u 奇异向量 A T A v = ( v u T ) ( u v T ) v = v ( u T u ) ( v T v ) 所以 σ 1 = ∣ ∣ u ∣ ∣ ∣ ∣ v ∣ ∣ \begin{array}{lll}\pmb{特征向量}&A\boldsymbol u=(\boldsymbol u\boldsymbol v^T)\boldsymbol u=\boldsymbol u(\boldsymbol v^T\boldsymbol u)=\lambda_1\boldsymbol u&所以\,\lambda_1=\boldsymbol v^T\boldsymbol u\\\\\pmb{奇异向量}&A^TA\boldsymbol v=(\boldsymbol v\boldsymbol u^T)(\boldsymbol u\boldsymbol v^T)\boldsymbol v=\boldsymbol v(\boldsymbol u^T\boldsymbol u)(\boldsymbol v^T\boldsymbol v)&所以\,\sigma_1=||\boldsymbol u||\,||\boldsymbol v||\end{array} 特征向量奇异向量Au=(uvT)u=u(vTu)=λ1uATAv=(vuT)(uvT)v=v(uTu)(vTv)所以λ1=vTu所以σ1=∣∣u∣∣∣∣v∣∣ ∣ λ 1 ∣ ≤ σ 1 |\lambda_1|\le\sigma_1 λ1σ1 正好对应施瓦茨不等式 ∣ v T u ∣ ≤ ∣ ∣ u ∣ ∣ ∣ ∣ v ∣ ∣ |\boldsymbol v^T\boldsymbol u|\le||\boldsymbol u||\,||\boldsymbol v|| vTu∣∣u∣∣∣∣v∣∣.
换个角度解释 ∣ λ 1 ∣ ≤ σ 1 |\lambda_1|\le\sigma_1 λ1σ1 A x = λ 1 x A\boldsymbol x=\lambda_1\boldsymbol x Ax=λ1x 中的特征向量得到比值 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ = ∣ ∣ λ 1 x ∣ ∣ ∣ ∣ x ∣ ∣ \displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||}=\frac{||\lambda_1\boldsymbol x||}{||\boldsymbol x||} ∣∣x∣∣∣∣Ax∣∣=∣∣x∣∣∣∣λ1x∣∣,这个就是 ∣ λ 1 ∣ |\lambda_1| λ1,最大的比值 σ 1 \sigma_1 σ1 不可能小于 ∣ λ 1 ∣ |\lambda_1| λ1.
那么 ∣ λ 2 ∣ ≤ σ 2 |\lambda_2|\le\sigma_2 λ2σ2 也是正确的吗?,这个完全是错误的,实际上 2 × 2 2\times2 2×2 的矩阵有 ∣ det ⁡ A ∣ = ∣ λ 1 λ 2 ∣ = σ 1 σ 2 |\det A|=|\lambda_1\lambda_2|=\sigma_1\sigma_2 detA=λ1λ2=σ1σ2,由于 ∣ λ 1 ∣ ≤ σ 1 |\lambda_1|\le\sigma_1 λ1σ1 将会得到 ∣ λ 2 ∣ ≥ ∣ σ 2 ∣ |\lambda_2|\ge|\sigma_2| λ2σ2.
距离矩阵 A 最近的秩 k 矩阵是 A k = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ k u k v k T \pmb{距离矩阵\,A\,最近的秩\,k\,矩阵是\,A_k=\sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T+\cdots+\sigma_k\boldsymbol u_k\boldsymbol v_k^T} 距离矩阵A最近的秩k矩阵是Ak=σ1u1v1T+σ2u2v2T++σkukvkT这是矩阵逼近理论中的关键结果:埃卡特-杨-米尔斯基(Eckart-Young-Mirsky)定理,其表述为 对所有的秩 k 矩阵都有: ∣ ∣ A − B ∣ ∣ ≥ ∣ ∣ A − A k ∣ ∣ = σ k + 1 \pmb{对所有的秩\,k\,矩阵都有:||A-B||\ge||A-A_k||=\sigma_{k+1}} 对所有的秩k矩阵都有:∣∣AB∣∣∣∣AAk∣∣=σk+1这一结论完善了线性代数基本定理, v i \boldsymbol v_i vi u i \boldsymbol u_i ui 给出矩阵 A A A 四个基本子空间的标准正交基,前 k k k v i \boldsymbol v_i vi u i \boldsymbol u_i ui σ i \sigma_i σi 给出了 A A A 的最佳近似。

三、极分解 A = QS

每个复数 x + i y x+iy x+iy 都有极形式 r e i θ re^{i\theta} reiθ,即是一个数字 r ≥ 0 r\ge0 r0 乘上单位圆周上的数 e i θ e^{i\theta} eiθ,我们有 x + i y = r cos ⁡ θ + i r sin ⁡ θ = r ( cos ⁡ θ + i sin ⁡ θ ) = r e i θ x+iy=r\cos\theta+ir\sin\theta=r(\cos\theta+i\sin\theta)=re^{i\theta} x+iy=rcosθ+irsinθ=r(cosθ+isinθ)=reiθ. 将这些数看成 1 × 1 1\times1 1×1 的矩阵,则 e i θ e^{i\theta} eiθ 就是一个正交矩阵 Q Q Q,而 r ≥ 0 r\ge0 r0 是一个半正定矩阵(positive semidefinite matrix,称为 S S S),将这个思想推广到 n × n n\times n n×n 的矩阵就是极分解(polar decomposition) 的概念:正交矩阵乘半正定矩阵, A = Q S \pmb{A=QS} A=QS.

任意的实方阵都可以分解为 A = Q S \pmb{A=QS} A=QS,这里 Q Q Q正交矩阵 S S S对称半正定矩阵。如果 A A A 可逆,则 S S S 是正定矩阵。

只需要插入 V T V = I V^TV=I VTV=I 代入 SVD 的中间,即可得到证明: 极分解 A = U Σ V T = ( U V T ) ( V Σ V T ) = ( Q ) ( S ) ( 7.4.4 ) {\color{blue}\pmb{极分解\kern 15ptA=U\Sigma V^T=(UV^T)(V\Sigma V^T)=(Q)(S)}}\kern 20pt(7.4.4) 极分解A=UΣVT=(UVT)(VΣVT)=(Q)(S)(7.4.4)第一个因子 U V T UV^T UVT Q Q Q,因为正交矩阵的乘积仍是正交矩阵。第二个因子 V Σ V T V\Sigma V^T VΣVT S S S,它是半正定矩阵,因为它的特征值在 Σ \Sigma Σ 中。
如果 A A A 可逆,则 Σ \Sigma Σ S S S 都可逆。由于 S 2 = V Σ 2 V T = A T A S^2=V\Sigma^2V^T=A^TA S2=VΣ2VT=ATA,所以 S \pmb S S A T A \pmb{A^TA} ATA 的对称正定平方根,所以 S S S 的特征值就是 A A A 的奇异值, S S S 的特征向量就是 A A A 的奇异向量 v \boldsymbol v v.
还有一种逆序的极分解 A = K Q A=KQ A=KQ Q Q Q 是一样的,但是 K = U Σ U T K=U\Sigma U^T K=UΣUT,此时 K K K A A T AA^T AAT 的半正定平方根。

例2】有 A = [ 3 0 4 5 ] = U Σ V T A=\begin{bmatrix}3&0\\4&5\end{bmatrix}=U\Sigma V^T A=[3405]=UΣVT,求出极分解 A = Q S A=QS A=QS 的因子 Q Q Q(旋转因子)和 S S S(伸缩矩阵)。
解: U = 1 10 [ 1 − 3 3 1 ] Σ = [ 45 5 ] V = 1 2 [ 1 − 1 1 1 ] Q = U V T = 1 20 [ 1 − 3 3 1 ] [ 1 1 − 1 1 ] = 1 20 [ 4 − 2 2 4 ] = 1 5 [ 2 − 1 1 2 ] S = V Σ V T = 5 2 [ 1 − 1 1 1 ] [ 3 1 ] [ 1 1 − 1 1 ] = 5 [ 2 1 1 2 ] \begin{array}{l}U=\displaystyle\frac{1}{\sqrt{10}}\begin{bmatrix}1&-3\\3&\kern 7pt1\end{bmatrix}\kern 10pt\Sigma=\begin{bmatrix}\sqrt{45}\\&\sqrt5\end{bmatrix}\kern 10ptV=\frac{1}{\sqrt2}\begin{bmatrix}1&-1\\1&\kern 7pt1\end{bmatrix}\\\\Q=UV^T=\displaystyle\frac{1}{\sqrt{20}}\begin{bmatrix}1&-3\\3&\kern 7pt1\end{bmatrix}\begin{bmatrix}\kern 7pt1&1\\-1&1\end{bmatrix}=\frac{1}{\sqrt{20}}\begin{bmatrix}4&-2\\2&\kern 7pt4\end{bmatrix}=\frac{1}{\sqrt5}\begin{bmatrix}2&-1\\1&\kern 7pt2\end{bmatrix}\\\\S=V\Sigma V^T=\displaystyle\frac{\sqrt5}{2}\begin{bmatrix}1&-1\\1&\kern 7pt1\end{bmatrix}\begin{bmatrix}3\\&1\end{bmatrix}\begin{bmatrix}\kern 7pt1&1\\-1&1\end{bmatrix}=\sqrt5\begin{bmatrix}2&1\\1&2\end{bmatrix}\end{array} U=10 1[1331]Σ=[45 5 ]V=2 1[1111]Q=UVT=20 1[1331][1111]=20 1[4224]=5 1[2112]S=VΣVT=25 [1111][31][1111]=5 [2112] A = Q S \pmb{A=QS} A=QS.
在力学中,极分解将旋转(在 Q Q Q 中)和伸缩(在 S S S 中)分开了。在 Figure 7.5 中, S S S 的特征值得到伸缩因子,特征向量给出了伸缩方向(椭圆的主轴);正交矩阵 Q Q Q 包含了旋转矩阵 U U U V T V^T VT
关于旋转的一个事实: Q = U V T Q=UV^T Q=UVT最接近 A A A 的正交矩阵,这个 Q Q Q 使得范数 ∣ ∣ Q − A ∣ ∣ ||Q-A|| ∣∣QA∣∣ 尽可能的小。与此相对应的是 e i θ e^{i\theta} eiθ 是单位圆周上最接近 r e i θ re^{i\theta} reiθ 最近的点。
SVD 告诉我们关于最近的奇异矩阵更重要的事实:

最接近 A A A 的奇异矩阵 A 0 A_0 A0 就是将它最小的奇异值 σ min ⁡ \sigma_{\min} σmin 置零

所以 σ min ⁡ \sigma_{\min} σmin 是度量 A A A 到奇异矩阵的距离,对于例 2 2 2 中的矩阵,这个距离是 σ min ⁡ = 5 \sigma_{\min}=\sqrt5 σmin=5 ,如果将 σ min ⁡ \sigma_{\min} σmin 置零,就是踢除 A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T A=\sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T A=σ1u1v1T+σ2u2v2T 中的最后(最小的)一项,那么就只有一个秩一(奇异)矩阵 σ 1 u 1 v 1 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T σ1u1v1T 会剩下来:最接近 A A A. 这个最小的变化范数是 σ 2 = 5 \sigma_2=\sqrt5 σ2=5 (比 3 3 3 小)。
在计算机实践中,经常会踢掉一些非常小的 σ \sigma σ,处理奇异矩阵要比处理这些趋近于零矩阵的部分而且无法注意到的要更好。

四、伪逆 A + A^+ A+

通过选择一组好基, A A A 乘行空间中的 v i \boldsymbol v_i vi 得到列空间中的 σ i u i \sigma_i\boldsymbol u_i σiui A − 1 A^{-1} A1 对应的是相反的操作,如果 A v = σ u A\boldsymbol v=\sigma\boldsymbol u Av=σu,则 A − 1 u = v σ A^{-1}\boldsymbol u=\displaystyle\frac{\boldsymbol v}{\sigma} A1u=σv A − 1 A^{-1} A1 的奇异值是 1 σ \displaystyle\frac{1}{\sigma} σ1,就像 A − 1 A^{-1} A1 的特征值是 1 λ \displaystyle\frac{1}{\lambda} λ1. 基被反转后, u \boldsymbol u u A − 1 A^{-1} A1 的行空间, v \boldsymbol v v A − 1 A^{-1} A1 的列空间。
到这里我们一般都会加上如果 A − 1 A^{-1} A1 存在这样的条件,但是这里不用,一个乘 u i \boldsymbol u_i ui 得到 v i σ i \displaystyle\frac{\boldsymbol v_i}{\sigma_i} σivi 的矩阵一定存在,它就是伪逆 A + A^{+} A+ A 的伪逆 A + = V Σ + U T = [ v 1 ⋯ v r ⋯ v n ] [ σ 1 − 1 ⋱ σ r − 1 ] [ u 1 ⋯ u r ⋯ u n ] T n × n n × m m × m \begin{array}{l}\pmb{A\,的伪逆}\\{\color{blue}A^+=V\Sigma^+U^T}&=\begin{bmatrix}\\\boldsymbol v_1&\cdots&\boldsymbol v_r&\cdots&\boldsymbol v_n\\\,\end{bmatrix}\begin{bmatrix}\sigma_1^{-1}\\&\ddots\\&&\sigma_r^{-1}\end{bmatrix}\begin{bmatrix}\\\boldsymbol u_1&\cdots&\boldsymbol u_r&\cdots&\boldsymbol u_n\\\,\end{bmatrix}^T\\&n\times n\kern 80ptn\times m\kern 80ptm\times m\end{array} A的伪逆A+=VΣ+UT= v1vrvn σ11σr1 u1urun Tn×nn×mm×m伪逆(pseudoinverse) A + A^{+} A+ 是一个 n × m n\times m n×m 的矩阵,如果 A − 1 A^{-1} A1 存在,则 A + A^+ A+ A − 1 A^{-1} A1 一样,在 m = n = r m=n=r m=n=r 这种情况下, U Σ V T U\Sigma V^T UΣVT 的逆就是 V Σ − 1 U T V\Sigma^{-1}U^T VΣ1UT. 如果 r < m r<m r<m r < n r<n r<n,我们就需要新的符号 A + A^+ A+,此时虽然 A A A 没有双边逆矩阵(左逆和右逆),但是它有一个有相同秩的伪逆 A + A^+ A+ 对于 i ≤ r : A + u i = 1 σ i v i 对于 i > r : A + u i = 0 \color{blue}对于\,i\le r:A^+\boldsymbol u_i=\frac{1}{\sigma_i}\boldsymbol v_i\kern 15pt对于\,i>r:A^+\boldsymbol u_i=\boldsymbol 0 对于irA+ui=σi1vi对于i>rA+ui=0 A A A 列空间中的向量 u 1 , u 2 , ⋯ u r \boldsymbol u_1,\boldsymbol u_2,\cdots\,\boldsymbol u_r u1,u2,ur 可以回到行空间中的向量 v 1 , v 2 , ⋯ , v r \boldsymbol v_1,\boldsymbol v_2,\cdots,\boldsymbol v_r v1,v2,,vr,其余的向量 u r + 1 , u r + 2 , ⋯ , u m \boldsymbol u_{r+1},\boldsymbol u_{r+2},\cdots,\boldsymbol u_m ur+1,ur+2,,um 在左零空间, A + A^+ A+ 将它们映射为零向量。当我们知道了这些全部基向量如何变化,也就知道了 A + A^+ A+.
注意对角矩阵 Σ \Sigma Σ 的伪逆, Σ \Sigma Σ 中的每个 σ \sigma σ 对应 Σ + \Sigma^+ Σ+ 中的 σ − 1 \sigma^{-1} σ1,乘积 Σ + Σ \Sigma^+\Sigma Σ+Σ 是一个很接近单位矩阵的矩阵,它是一个投影矩阵,它包含子矩阵 I I I,其余的都是零。我们可以对每个 σ \sigma σ 求逆,但是对零行和零列什么也做不了。下例中 σ 1 = 2 , σ 2 = 3 \sigma_1=2,\sigma_2=3 σ1=2,σ2=3 Σ + Σ = [ 1 / 2 0 0 0 1 / 3 0 0 0 0 ] [ 2 0 0 0 3 0 0 0 0 ] = [ 1 0 0 0 1 0 0 0 0 ] = [ I 0 0 0 ] \Sigma^+\Sigma=\begin{bmatrix}\pmb{1/2}&0&0\\0&\pmb{1/3}&0\\0&0&\pmb0\end{bmatrix}\begin{bmatrix}\pmb2&0&0\\0&\pmb3&0\\0&0&\pmb0\end{bmatrix}=\begin{bmatrix}\pmb1&0&0\\0&\pmb1&0\\0&0&\pmb0\end{bmatrix}=\begin{bmatrix}\pmb I&0\\0&\pmb0\end{bmatrix} Σ+Σ= 1/20001/30000 200030000 = 100010000 =[I000]伪逆 A + A^+ A+ 是一个 n × m n\times m n×m 的矩阵,它使得 A A + AA^+ AA+ A + A A^+A A+A 成为投影矩阵。

在这里插入图片描述

对比 A A − 1 = A − 1 A = I A A + = 到 A 列空间上的投影矩阵 A + A = 到 A 行空间上的投影矩阵 \begin{array}{l}\pmb{对比}\\AA^{-1}=A^{-1}A=I\end{array}\kern 16pt\color{blue}\begin{array}{l}AA^+=到\,A\,列空间上的投影矩阵\\A^+A=到\,A\,行空间上的投影矩阵\end{array} 对比AA1=A1A=IAA+=A列空间上的投影矩阵A+A=A行空间上的投影矩阵

注:Figure 7.6 中 A + A = [ I 0 0 0 ] A^+A=\begin{bmatrix}I&0\\0&0\end{bmatrix} A+A=[I000] 是在 SVD 正交基(右奇异向量)的表示,其几何意义是保留行空间的分量,将零空间分量归零

例3】每个秩一矩阵都是一个行向量乘一个列向量。取单位向量 u \boldsymbol u u v \boldsymbol v v,则 A = σ u v T A=\sigma\boldsymbol u\boldsymbol v^T A=σuvT,它的伪逆是 A + = v u T σ A^+=\displaystyle\frac{\boldsymbol v\boldsymbol u^T}{\sigma} A+=σvuT,乘积 A A + AA^+ AA+ u u T \boldsymbol u\boldsymbol u^T uuT,就是到过向量 u \boldsymbol u u 的直线上的投影。乘积 A + A A^+A A+A v v T \boldsymbol v\boldsymbol v^T vvT.

例4】求 A = [ 1 1 1 1 ] A=\begin{bmatrix}1&1\\1&1\end{bmatrix} A=[1111] 的伪逆。这个矩阵不可逆,它的秩为 1 1 1,唯一的奇异值是 σ 1 = 2 \sigma_1=2 σ1=2,伪逆的奇异值就是 σ 1 \sigma_1 σ1 的倒数,它在秩一的 Σ + \Sigma^+ Σ+ 中: A + = V Σ + U T = 1 2 [ 1 1 1 − 1 ] [ 1 / 2 0 0 0 ] 1 2 [ 1 1 1 − 1 ] = 1 4 [ 1 1 1 1 ] A^+=V\Sigma^+U^T=\frac{1}{\sqrt2}\begin{bmatrix}1&\kern 7pt1\\1&-1\end{bmatrix}\begin{bmatrix}1/2&0\\0&0\end{bmatrix}\frac{1}{\sqrt2}\begin{bmatrix}1&\kern 7pt1\\1&-1\end{bmatrix}=\pmb{\frac{1}{4}\begin{bmatrix}1&1\\1&1\end{bmatrix}} A+=VΣ+UT=2 1[1111][1/2000]2 1[1111]=41[1111] A + A^+ A+ 的秩也为 1 1 1,它的列空间是 A A A 的行空间。

五、列线性相关矩阵的最小二乘解

如果矩阵 A = [ 1 1 1 1 ] A=\begin{bmatrix}1&1\\1&1\end{bmatrix} A=[1111],它的四个元素全为 1 1 1,不满足列线性无关的要求。这个矩阵可能由我们在时刻 t = 1 t=1 t=1 的两次测量结果得到,最优直线过测量值 1 1 1 3 3 3 的中点,但是无法确定最优直线的斜率。
用矩阵语言表达, A T A A^TA ATA 是奇异的,方程 A T A x = A T b A^TA\boldsymbol x=A^T\boldsymbol b ATAx=ATb 有无穷多个解。伪逆给出了一种选择 “最优解” 的一种方法 x + = A + b \boldsymbol x^+=A^+\boldsymbol b x+=A+b.
先写出无解的方程 A x = b A\boldsymbol x=\boldsymbol b Ax=b 和无穷多个解的方程 A T A x ^ = A T b A^TA\hat{\boldsymbol x}=A^T\boldsymbol b ATAx^=ATb A x = [ 1 1 1 1 ] [ x 1 x 2 ] = [ 3 1 ] = b A T A x ^ = [ 2 2 2 2 ] [ x ^ 1 x ^ 2 ] = [ 4 4 ] = A T b A\boldsymbol x=\begin{bmatrix}1&1\\1&1\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}3\\1\end{bmatrix}=\boldsymbol b\kern 17ptA^TA\hat{\boldsymbol x}=\begin{bmatrix}2&2\\2&2\end{bmatrix}\begin{bmatrix}\hat x_1\\\hat x_2\end{bmatrix}=\begin{bmatrix}4\\4\end{bmatrix}=A^T\boldsymbol b Ax=[1111][x1x2]=[31]=bATAx^=[2222][x^1x^2]=[44]=ATb任意向量 x ^ = ( 1 + c , 1 − c ) \hat x=(1+c,1-c) x^=(1+c,1c) 都是正规方程组(normal equations) A T A x ^ = b A^TA\hat{\boldsymbol x}=\boldsymbol b ATAx^=b 的解,伪逆的目的就是选择一个解 x ^ = x + \hat{\boldsymbol x}=\boldsymbol x^+ x^=x+.

x + = A + b = ( 1 , 1 ) 是 A T A x ^ = A T b 和 A x ^ = p 的最短解 \color{blue}\boldsymbol x^+=A^+\boldsymbol b=(1,1)\,是\,A^TA\hat{\boldsymbol x}=A^T\boldsymbol b\,和\,A\hat{\boldsymbol x}=\boldsymbol p\, 的最短解 x+=A+b=(1,1)ATAx^=ATbAx^=p的最短解

可以看出 x + = ( 1 , 1 ) \boldsymbol x^+=(1,1) x+=(1,1)(这里是斜率和截距)比其它的任何解 x ^ = ( 1 + c , 1 − c ) \hat{\boldsymbol x}=(1+c,1-c) x^=(1+c,1c) 都短, x ^ \hat{\boldsymbol x} x^ 长度的平方是 ( 1 + c ) 2 + ( 1 − c ) 2 = 2 + 2 c 2 (1+c)^2+(1-c)^2=2+2c^2 (1+c)2+(1c)2=2+2c2,最短的选择就是 c = 0 c=0 c=0,此时给出了 A A A 行空间的解 x + = ( 1 , 1 ) \boldsymbol x^+=(1,1) x+=(1,1).
A + A^+ A+ 的几何意义:由 A A A 的列空间得到行空间,这两个空间都是 r r r 维的,左零空间中的误差向量 e \boldsymbol e e 映射为零向量。
伪逆 A + A^+ A+ 和最优解 x + \boldsymbol x^+ x+ 在统计学中非常关键,因为实验得到的矩阵通常列向量和行向量都是线性相关的。

六、主要内容总结

  1. 向量 A x A\boldsymbol x Ax 所形成椭圆的对称轴沿奇异向量 u i \boldsymbol u_i ui 的方向。
  2. 矩阵范数 ∣ ∣ A ∣ ∣ = σ 1 ||A||=\sigma_1 ∣∣A∣∣=σ1 源自向量的长度: ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ \displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||} ∣∣x∣∣∣∣Ax∣∣ 的最大值。
  3. 可逆矩阵 = (正交矩阵)(正定矩阵): A = Q S A=QS A=QS.
  4. 任意矩阵 A = U Σ V T A=U\Sigma V^T A=UΣVT 都有伪逆 A + = V Σ + U T A^+=V\Sigma^+U^T A+=VΣ+UT,它将左零空间 N ( A T ) \pmb N(A^T) N(AT) 映射为零空间 Z \pmb Z Z.

七、例题

例5】如果 m × n m\times n m×n 的矩阵 A A A 的秩为 n n n,即列满秩,则它有左逆(left inverse) L = ( A T A ) − 1 A T L=(A^TA)^{-1}A^T L=(ATA)1AT,由这个矩阵 L L L 可得 L A = I \pmb{LA=I} LA=I,解释为什么这种情况下伪逆 A + = L \pmb{A^+=L} A+=L.
如果 A A A 的秩为 m m m,即行满秩,则它有右逆(right inverse) R = A T ( A A T ) − 1 R=A^T(AA^T)^{-1} R=AT(AAT)1,由这个矩阵 R R R 可得 A R = I \pmb{AR=I} AR=I,解释为什么这种情况想伪逆 A + = R \pmb{A^+=R} A+=R.
A 1 A_1 A1 L L L A 2 A_2 A2 R R R,并分别求出矩阵 A 1 , A 2 , A 3 A_1,A_2,A_3 A1,A2,A3 的伪逆: A 1 = [ 2 2 ] A 2 = [ 2 2 ] A 3 = [ 2 2 1 1 ] A_1=\begin{bmatrix}\pmb2\\\pmb2\end{bmatrix}\kern 10ptA_2=\begin{bmatrix}\pmb2&\pmb2\end{bmatrix}\kern 10ptA_3=\begin{bmatrix}\pmb2&\pmb2\\\pmb1&\pmb1\end{bmatrix} A1=[22]A2=[22]A3=[2121]解: 如果 A A A 的各列线性无关则 A T A A^TA ATA 可逆,从而 L = ( A T A ) − 1 A T L=(A^TA)^{-1}A^T L=(ATA)1AT A A A L A = I LA=I LA=I:有左逆。
A L = A ( A T A ) − 1 A T AL=A(A^TA)^{-1}A^T AL=A(ATA)1AT 是到列空间的投影矩阵,所以 L L L 符合 A + A^+ A+ 的要求: L A LA LA A L AL AL 分别是到 C ( A ) \pmb C(A) C(A) C ( A T ) \pmb C(A^T) C(AT) 的投影。
如果 A A A 的秩为 m m m,即行满秩,则 A A T AA^T AAT 可逆,从而 A A A R = A T ( A A T ) − 1 R=A^T(AA^T)^{-1} R=AT(AAT)1 A R = I AR=I AR=I. 反向相乘时, R A = A T ( A A T ) − 1 A RA=A^T(AA^T)^{-1}A RA=AT(AAT)1A 是到行空间的投影矩阵( A T A^T AT 的列向量),所以 R R R 等于伪逆 A + A^+ A+.
矩阵 A 1 A_1 A1 列满秩,有左逆 L = A 1 + L=A_1^+ L=A1+,矩阵 A 2 A_2 A2 行满秩,有右逆 R = A 2 + R=A_2^+ R=A2+ A 1 + = ( A 1 T A 1 ) − 1 A 1 T = 1 8 [ 2 2 ] A 2 + = A 2 T ( A 2 A 2 T ) − 1 = 1 8 [ 2 2 ] A_1^+=(A_1^TA_1)^{-1}A_1^T=\frac{1}{8}\begin{bmatrix}2&2\end{bmatrix}\kern 15ptA_2^+=A_2^T(A_2A_2^T)^{-1}=\frac{1}{8}\begin{bmatrix}2\\2\end{bmatrix} A1+=(A1TA1)1A1T=81[22]A2+=A2T(A2A2T)1=81[22]注意: A 1 + A 1 = [ 1 ] , A 2 A 2 + = [ 1 ] A_1^+A_1=[1],\kern 3ptA_2A_2^+=[1] A1+A1=[1],A2A2+=[1]. 但是 A 3 A_3 A3 没有左逆和右逆,它不是满秩矩阵, A 3 A_3 A3 的伪逆将它的列空间作用到行空间。 A 3 + = [ 2 2 1 1 ] + = v 1 u 1 T σ 1 = 1 10 [ 2 1 2 1 ] A_3^+=\begin{bmatrix}2&2\\1&1\end{bmatrix}^+=\frac{\boldsymbol v_1\boldsymbol u_1^T}{\sigma_1}=\frac{1}{10}\begin{bmatrix}\pmb2&\pmb1\\\pmb2&\pmb1\end{bmatrix} A3+=[2121]+=σ1v1u1T=101[2211]

相关文章:

7.4 SVD 的几何背景

一、SVD 的几何解释 SVD 将矩阵分解成三个矩阵的乘积&#xff1a; ( 正交矩阵 ) ( 对角矩阵 ) ( 正交矩阵 ) (\pmb{正交矩阵})\times(\pmb{对角矩阵})(\pmb{正交矩阵}) (正交矩阵)(对角矩阵)(正交矩阵)&#xff0c;用几何语言表述其几何背景&#xff1a; ( 旋转 ) ( 伸缩 )…...

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…...

BN 层做预测的时候, 方差均值怎么算

✅ 一、Batch Normalization&#xff08;BN&#xff09;回顾 BN 层在训练和推理阶段的行为是不一样的&#xff0c;核心区别就在于&#xff1a; 训练时用 mini-batch 里的均值方差&#xff0c;预测时用全局的“滑动平均”均值方差。 &#x1f9ea; 二、训练阶段&#xff08;Trai…...

【AI热点】meta新发布llama4深度洞察(快速认知)

以下是一份针对新发布的 Llama 4 模型的深度洞察报告。报告将从模型家族整体概览、技术创新与架构特点、功能与性能表现、多模态与超长上下文、与主流竞品比较、应用场景与未来展望六大部分进行分析和总结。 一、Llama 4 家族整体概览 家族成员 Llama 4 Scout 总参数量约 10…...

大厂机考——各算法与数据结构详解

目录及其索引 哈希双指针滑动窗口子串普通数组矩阵链表二叉树图论回溯二分查找栈堆贪心算法动态规划多维动态规划学科领域与联系总结​​ 哈希 ​​学科领域​​&#xff1a;计算机科学、密码学、数据结构 ​​定义​​&#xff1a;通过哈希函数将任意长度的输入映射为固定长度…...

前端面试的ACM模式笔试输入模式

在前端面试的ACM模式笔试中&#xff0c;输入参数的读取是核心技能之一&#xff0c;以下是常见场景的代码实现及注意事项&#xff1a; 一、JavaScript的两种输入模式 1. V8模式&#xff08;浏览器环境/部分OJ平台&#xff09; • 核心方法&#xff1a;通过 read_line() 或 rea…...

AIP-215 API特定proto

编号215原文链接AIP-215: API-specific protos状态批准创建日期2018-10-01更新日期2018-10-01 API通常使用API特定proto定义&#xff0c;偶尔依赖通用组件。保持API相互隔离可以避免版本问题和客户端库打包问题。 指南 所有特定于某个API的protos 必须 位于带有主版本号的包…...

计算机毕业设计指南

哈喽各位大四的小伙伴们&#xff0c;以下是一份详细的计算机专业毕业设计指南&#xff0c;涵盖选题、流程、技术选型、开发建议和常见问题解决方案&#xff0c;帮助你高效完成毕业设计&#xff0c;如有其他问题&#xff0c;欢迎点击文章末尾名片进行咨询&#xff0c;可免费赠送…...

内网渗透-Linux提权之suid提权

Linux提权之suid提权 suid简介 在Linux系统中的文件&#xff0c;通常有rwx也就是读、写、执行三种权限&#xff0c;但其实还有第四种权限&#xff0c;也就是suid权限。在执行拥有suid权限的文件的过程中&#xff0c;会获得文件属主的权限。例如&#xff0c;当cat命令具有suid…...

FreeCAD傻瓜教程-钣金工作台SheetMetal的安装和简单使用

起因&#xff1a; 因为需要在平面上固定一段比较短的铝型材&#xff0c;角码太占用横向空间&#xff0c;所以想做两个Z字固定片&#xff0c;将型材从两端进行螺丝固定。在绘图的时候想到&#xff0c;板材折弯后的长度。开孔位置等都会有所变化&#xff0c;如何确定相关的尺寸&a…...

语法: ptr=malloc(size)

MALLOC( ) 语法: ptrmalloc(size) 参数: size是一个整数,表示被分配的字节个数; 返回值: 如果允许的话,返回值是一个指向被分配存储器的指针;否则的话, 返回值是一个非指针; 功能: 该函数用来分配一定大小的空间给一个对象,其大小为size,但该空间的值为不确定值; 有…...

(五)安卓开发中的滚动布局(ScrollView / HorizontalScrollView)使用详解

在安卓开发中&#xff0c;滚动布局是一种非常重要的布局方式&#xff0c;它允许用户在屏幕上滚动查看超出屏幕范围的内容。本文将详细讲解滚动布局的基本概念、主要属性、代码示例以及具体的使用场景&#xff0c;帮助开发者深入理解并灵活运用。 基本概念 滚动布局本质上是一个…...

Matlab:三维绘图

目录 1.三维曲线绘图命令&#xff1a;plot3 实例——绘制空间直线 实例——绘制三角曲线 2.三维曲线绘图命令&#xff1a;explot3 3.三维网格命令&#xff1a;mesh 实例——绘制网格面 实例——绘制山峰曲面 实例——绘制函数曲线 1.三维曲线绘图命令&#xff1a;plot3 …...

Java中String、Array、List的相互转换工具类

Java中的数组与集合类的使用,系列文章: 《Java数组》 《Java集合类》 《Java中String、Array、List的相互转换工具类》 《Java8使用Stream流实现List列表的查询、统计、排序、分组》 《Java实现List集合的排序:Comparable接口、Comparator接口、stream().sorted()方法的使用…...

【HFP】蓝牙HFP应用层核心技术研究

免提配置文件(Hands-Free Profile, HFP)作为实现设备间音频通信的关键协议,广泛应用于车载系统、蓝牙耳机等场景。本文将基于最新技术规范,深入剖析HFP应用层的功能要求、协议映射及编解码器支持,为蓝牙开发工程师提供详尽的技术指南。 一、HFP应用层功能全景图 HFP定义…...

P1734 最大约数和(dp)

题目描述 选取和不超过 S 的若干个不同的正整数&#xff0c;使得所有数的约数&#xff08;不含它本身&#xff09;之和最大。 输入格式 输入一个正整数 S。 输出格式 输出最大的约数之和。 输入输出样例 输入 #1复制 11 输出 #1复制 9 说明/提示 【样例说明】 取数…...

P1596 [USACO10OCT] Lake Counting S(DFS)

题意翻译 由于近期的降雨&#xff0c;雨水汇集在农民约翰的田地不同的地方。我们用一个 NM(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水&#xff08;W&#xff09; 或是旱地&#xff08;.&#xff09;。一个网格与其周围的八个网格相连&#xff0c;而一组相连的网格视…...

ROS Bag 数据裁剪教程

ROS Bag 数据裁剪教程 文章目录 ROS Bag 数据裁剪教程1. Bag 数据显示2. Bag 数据裁剪2.1 基本命令2.2 过滤更多条件2.3 注意事项 在使用 ROS 进行机器人开发和调试时&#xff0c;我们经常需要使用 rosbag 工具来记录和回放传感器数据、日志等信息。本文将介绍如何使用 rosba…...

AF3 OpenFoldDataLoader类解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类继承自 PyTorch 的 torch.utils.data.DataLoader。该类主要对原始 DataLoader 做了批数据增强与控制循环迭代次数(recycling)相关的处理。 源代码: class OpenFoldDataLoader(torch.utils.data.DataLoader):def __in…...

基于内容的课程推荐网站的设计与实现00(SSM+htmlL)

基于内容的课程推荐网站的设计与实现(SSMhtml) 该系统是一个基于内容的课程推荐网站&#xff0c;旨在为用户提供个性化的课程推荐。系统包含多个模块&#xff0c;如教学视频、教学案例、课程信息、系统公告、个人中心和后台管理。用户可以通过首页访问不同的课程分类&#xff…...

【Linux网络】以太网(数据链路层)

认识以太网 两台主机在同一个局域网下是可以进行通信的,因为每台主机都有自己的标识符. 太网是负责直接相连的两个设备之间的可靠数据传输,"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容.在局域网中&#x…...

大模型学习五:‌DeepSeek Janus-Pro-7B 多模态半精度本地部署指南:环境是腾讯cloudstudio高性能GPU 16G免费算力

一、说明介绍 由于前面玩过了&#xff0c;所以啥也别说&#xff0c;就是显存不够玩&#xff0c;要优化&#xff0c;没钱就是这么回事&#xff0c;看下图&#xff0c;显存实际只有15360M&#xff0c;确实是16G 如何获取算力 二、如何获取算力 1、进入网址 Cloud Studio 2、没有…...

Spring 中的事务

&#x1f9fe; 一、什么是事务&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事务 一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;不能只做一半。 比如你转账&#xff1a; A 账户扣钱B 账户加钱 如果 A 扣了钱但 B 没收到&#xff0c;那就出问…...

2025-04-06 NO.2 Quest3 基础配置与打包

文章目录 1 场景配置1.1 开启手势支持1.2 创建 OVRCameraRig1.3 创建可交互 Cube 2 打包配置 环境&#xff1a; Windows 11Unity6000.0.42f1 Quest3 开发环境配置见 2025-03-17 NO.1 Quest3 开发环境配置教程_quest3 unity 开发流程-CSDN博客。 1 场景配置 1.1 开启手势支持 …...

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…...

LeetCode 每日一题 2025/3/31-2025/4/6

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/31 2278. 字母在字符串中的百分比4/1 2140. 解决智力问题4/2 2873. 有序三元组中的最大值 I4/3 2874. 有序三元组中的最大值 II4/4 1123. 最深叶节点的最近公共祖先4/5 1…...

mybatis plus 实体类基于视图,更新单表的时候报视图或函数‘v_视图名‘不可更新,因为修改会影响多个基表的错误的简单处理方法。

1、之前的文章中写了一下基于视图的实体&#xff0c;因为当前测试通过了&#xff0c;可能有缓存。 2、然后今天又用到了这个方法&#xff0c;发现报错了&#xff1a; 建了一下视图&#xff0c;将实体类绑定到了视图中&#xff0c;并不是原表中。 3、用mybatis提供的注解或者x…...

语法: i8=make8( var, offset);

MAKE8( ) 语法: i8make8( var, offset); 参数: var是16位或32位整数; offset是字节的偏移量,为1,2或3; 返回值: 返回值是一个8位整数; 功能: 该函数用来摘取以var为基址, offset为偏移量,所指向单元的字节;除了执行单字节复制之外,还相当于i8( ( var>>(offset…...

Seata TCC模式是怎么实现的?

Seata TCC 模式实现原理 TCC(Try-Confirm-Cancel)是 Seata 提供的分布式事务解决方案之一,适用于 高并发、高性能 场景,通过 业务补偿 保证最终一致性。其核心思想是将事务拆分为三个阶段: Try:预留资源(冻结数据,检查约束)。Confirm:确认提交(真正扣减资源)。Can…...

sentinel新手入门安装和限流,热点的使用

1 sentinel入门 1.1下载sentinel控制台 &#x1f517;sentinel管理后台官方下载地址 下载完毕以后就会得到一个jar包 1.2启动sentinel 将jar包放到任意非中文目录&#xff0c;执行命令&#xff1a; java -jar 名字.jar如果要修改Sentinel的默认端口、账户、密码&#xff…...

对责任链模式的理解

对责任链模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1100)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用责任链模式1、代码2、缺点 三、采用责任链模式1、代码2、优点 四、思考 一、场景 1、题目【来源】 …...

AGI大模型(11):RAG系统

1 RAG概念 RAG(Retrieval Augmented Generation)顾名思义,通过检索外部数据,增强大模型的生成效果。 RAG即检索增强生成,为LLM提供了从某些数据源检索到的信息,并基于此修正生成的答案。RAG基本上是Search + LLM 提示,可以通过大模型回答查询,并将搜索算法所找到的信…...

请问你了解什么测试方法?

测试方法在软件测试中是保障软件质量的关键手段,我将从黑盒测试、白盒测试、灰盒测试等方面为你介绍常见的测试方法: 黑盒测试方法 黑盒测试把软件看作一个黑盒子,不考虑内部结构和实现细节,只关注输入和输出。 等价类划分法:将输入数据划分为有效等价类和无效等价类,从…...

【springcloud】快速搭建一套分布式服务springcloudalibaba(三)

第三篇 基于nacos搭建分布式项目 分布式事务&#xff08;分布式锁事务&#xff09; 项目所需 maven nacos java8 idea git mysql(下单) redis(分布式锁) 本文主要讲解客户下单时扣减库存的操作&#xff0c;网关系统/用户系统/商品系统/订单系统 请先准备好环境&#xff0…...

Nginx-keepalived-高可用

Nginx 高可用 通常 借助 Keepalived 实现&#xff0c; Keepalived 能通过 VRRP &#xff08;虚拟路由冗余协议&#xff09;让多个 Nginx 服务器 组成一个 热备集群&#xff0c;当主服务器故障时自动切换到备用服务器&#xff0c;保障服务不间断。 一、环境准备 角色IP 地址主…...

Linux系统管理(十九)——欧拉系统硬盘挂载、网络配置以及Docker环境安装

挂载硬盘 如果数据盘在安装操作系统的时候没有挂载&#xff0c;需要自己做一下硬盘的挂载 查看需要挂载硬盘的路径 fdisk -l这里的可挂载的硬盘路径为&#xff1a;/dev/sdb MBR分区方式转换成GPT MBR分区能挂载的硬盘空间有限&#xff0c;无法挂载全部硬盘空间&#xff0…...

vue记忆卡牌游戏

说明&#xff1a; 我希望用vue做一款记忆卡牌游戏 游戏规则如下&#xff1a; 游戏设置&#xff1a;使用3x4的网格&#xff0c;包含3对字母&#xff08;A,B,C,D,E,F&#xff09;。 ​随机洗牌&#xff1a;初始字母对被打乱顺序&#xff0c;生成随机布局。 ​游戏流程&#xff1a…...

LearnOpenGL-笔记-其九

今天让我们完结高级OpenGL的部分&#xff1a; Instancing 很多时候&#xff0c;在场景中包含有大量实例的时候&#xff0c;光是调用GPU的绘制函数这个过程都会带来非常大的开销&#xff0c;因此我们需要想办法在每一次调用GPU的绘制函数时尽可能多地绘制&#xff0c;这个过程就…...

开源软件与自由软件:一场理念与实践的交锋

在科技的世界里&#xff0c;“开源软件”和“自由软件”这两个词几乎无人不知。很多人或许都听说过&#xff0c;它们的代码是公开的&#xff0c;可以供所有人查看、修改和使用。然而&#xff0c;若要细究它们之间的区别&#xff0c;恐怕不少朋友会觉得云里雾里。今天&#xff0…...

关于使用HAL_ADC_Start函数时为什么要放在while里的解释

HAL_ADC_Start() 是一个用于启动 ADC&#xff08;模数转换器&#xff09;转换的函数&#xff0c;那为什么有时候我们会看到它被放在 while 循环里呢&#xff1f;其实取决于你使用的是哪种ADC采样方式&#xff0c;我们来细说&#x1f447;&#xff1a; &#x1f9e0; 一、先搞清…...

Qt 入门 2 之窗口部件 QWidget

Qt 入门2之窗口部件 QWidget Qt Creator 提供的默认基类只有QMainWindow、QWidget和QDialog 这3种&#xff0c;这3种窗体也是以后用得最多的&#xff0c;QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而它们全部继承自QWidget。不仅如此,其实所有的窗…...

在 Windows 上安装 WSL Ubuntu 的完整避坑指南:从报错到成功运行

问题背景​​ 最近在尝试通过 ​​Windows Subsystem for Linux (WSL)​​ 安装 Ubuntu 时&#xff0c;遇到了一系列报错。最初的步骤是直接使用 wsl --install 命令&#xff0c;但安装完成后发现系统中并未自动安装默认的 Ubuntu 发行版。随后尝试通过命令行手动选择发行版&a…...

STM32看门狗原理与应用详解:独立看门狗 vs 窗口看门狗(上) | 零基础入门STM32第九十四步

主题内容教学目的/扩展视频看门狗什么是看门狗&#xff0c;原理分析&#xff0c;启动喂狗方法&#xff0c;读标志位。熟悉在程序里用看门狗。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、看门狗核心原理1.1 工作原理图解1.2 经典水桶比喻 二、STM32看门狗双雄…...

Hyperlane 框架路由功能详解:静态与动态路由全掌握

Hyperlane 框架路由功能详解&#xff1a;静态与动态路由全掌握 Hyperlane 框架提供了强大而灵活的路由功能&#xff0c;支持静态路由和动态路由两种模式&#xff0c;让开发者能够轻松构建各种复杂的 Web 应用。本文将详细介绍这两种路由的使用方法。 静态路由&#xff1a;简单…...

webpack js 逆向 --- 个人记录

网站 aHR0cDovL2FlcmZheWluZy5jb20v加密参数 参数加密位置 方法&#xff1a; 1. 构造自执行函数 !function(e) {// 加载器 }(// 模块1&#xff1b;// 模块2 )2. 找到js的加载器 3. 把上述代码放入第一步构造的自执行函数(完整扣取一整个加载器里的代码)&#xff0c;并用一…...

代码随想录回溯算法03

93.复原IP地址 本期本来是很有难度的&#xff0c;不过 大家做完 分割回文串 之后&#xff0c;本题就容易很多了 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;回溯算法如何分割字符串并判断是合法IP&#xff1f;| LeetCode&#xff1a;93.复原IP地址_哔哩哔…...

SOMEIP通信矩阵解读

目录 1 摘要2 SOME/IP通信矩阵详细属性定义与示例2.1 服务基础属性2.2 数据类型定义2.3 服务实例与网络配置参数2.4 SOME/IP-SD Multicast 配置&#xff08;SOME/IP服务发现组播配置&#xff09;2.5 SOME/IP-SD Unicast 配置2.6 SOME/IP-SD ECU 配置参数详解 3 总结 1 摘要 本…...

keys简单通用命令

目录 一、通配符匹配key 二、key的常用命令 1&#xff09;exists 判断某个key是否存在 2&#xff09;删除key 3&#xff09;expire设置key的过期时间、ttl查询key的过期时间 4&#xff09;type可以获取key对应的value的类型 一、通配符匹配key redis作为键值对类型的数据…...

Linux : 页表

目录 一 前言 二 深入理解页表 三 页表的实际组成 四 总结 一 前言 页表是我们之前在讲到Linux : 进程地址空间-CSDN博客的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它&#xff0c;物理内存的数据和代码才能映射到进程的程序地址空间…...

多智能体优秀开发框架

原文链接:https://i68.ltd/notes/posts/20250402-multi-agent/ motia-面向软件工程师的智能体框架 项目仓库:https://github.com/MotiaDev/motia 1.3k官方网站:https://motia.devMotia 允许开发人员在几分钟内创建&#xff0c;测试和部署生产就绪的 AI 代理&#xff0c;在一个…...