常用矩阵特性摘要

p9fU7Zj.png

一. 基本概念

1.1 矩阵

img

Matrix.

矩阵的本质是什么? - 知乎 (zhihu.com)

A=[a11a12...a1na21a22...a2n............am1am2...amn]m=n,,m;,.m=1,,n;n=1,,m.\mathbf{A}=\begin{bmatrix} a_{11} & a_{12} & ... &a_{1n} \\ a_{21} & a_{22} & ... &a_{2n} \\ ... & ... & ... &... \\ a_{m1} & a_{m2} & ... &a_{mn} \end{bmatrix}\\ m = n, 则称为方阵, 或者m阶矩阵;\\ 不同的方阵之间存在相同的行列数, 则称为同阶矩阵.\\ m = 1, 则称为行矩阵, 也称n维行向量;\\ n = 1, 则称为列矩阵, 也称m维列向量.

1.2 秩

The Rank of Matrix

矩阵的秩是线性代数中的一个概念. 在线性代数中 一个矩阵A的列秩是A的线性独立的纵列的极大数 通常表示为r(A) rk(A)或rank A. 在线性代数中 一个矩阵A的列秩是A的线性独立的纵列的极大数目. 类似地 行秩是A的线性无关的横行的极大数目. 即如果把矩阵看成一个个行向量或者列向量 秩就是这些行向量或者列向量的秩 也就是极大无关组中所含向量的个数.

矩阵的秩_百度百科 (baidu.com)

:rank(A),rk(A),r(A):1.2.R(A)min{m,n},Amn3.R(kA)=R(A),k04.R(A)=0A=0.5.R(A+B)R(A)+R(B)An.R(A)=nA()R(A)<nA()R(A)=nA0AE.AAA=[123212312]r22r1r33r1[123034023]r1+r3r2r3[100011023](r3+2r2)[100011001](r2r3)[100010001]=ER(A)=3A.常见表示: rank(A), rk(A), r(A)\\ 秩的特性:\\ 1. 转置后秩不变\\ 2. R(A) \leq min\{m, n\}, A是m行n列矩阵\\ 3. R(kA) = R(A), k \neq 0\\ 4. R(A) = 0 \rightarrow A = 0.\\ 5. R(A + B) \leq R(A) + R(B) \\\\ A为n阶方阵时.\\ R ( A ) = n 称A是满秩阵 (非奇异矩阵)\\ R ( A ) < n 称A是降秩阵 (奇异矩阵)\\ R(A) = n ⟺ ∣A∣ \neq 0\\ \\\\ 对于满秩方阵A施行初等行变换可以化为单位阵E 又根据初等阵的作用.\\ 每对A施行一次初等行变换 相当于用一个对应的初等阵左乘A 由此得到下面的定理\\ A = \begin{bmatrix} 1 & 2 & 3 \\2 & 1 & 2 \\ 3 & 1 & 2 \\ \end{bmatrix}\\ -\begin{matrix} {r_2-2r_1} \\ {r_3-3r_1} \end{matrix}\rightarrow \begin{bmatrix} 1 & 2 & 3 \\ 0 & -3 & -4 \\ 0 & -2 & -3 \\ \end{bmatrix}-\begin{matrix} {r_1+r_3} \\ {r_2-r_3} \end{matrix} \rightarrow\\ \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & -1 \\ 0 & -2 & -3 \\ \end{bmatrix}\\ -\begin{matrix} {(-r_3+2r_2)} \end{matrix}\rightarrow\begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & -1 \\ 0 & 0 & 1 \\ \end{bmatrix}-\begin{matrix} {(-r_2-r_3)}\end{matrix}\rightarrow\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} = E\\ R(A)=3 A为满秩方阵.

a = np.mat([
    [401, -201],
    [-800, 401]
])

np.linalg.matrix_rank(a)
2

np.linalg.matrix_rank(np.mat([
    [1, 2],
    [2, 4]
]))
1

1.3 迹

Trace

一个n×n矩阵A(方阵)的主对角线( 从左上方至右下方的对角线) 上各个元素的总和被称为矩阵A的迹( 或迹数) 一般记作tr(A).

https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E7%9A%84%E8%BF%B9?fromModule=lemma_search-box

tr(A)=a11+...+ann=i=1naii.tr(A)=tr(AT),线tr(A+B)=tr(A)+tr(B)tr(AB)=tr(BA)tr(ABC)=tr(CBA)=tr(BCA)tr((AB)TC)=tr((A)T(BC)).tr(A)=k=1nλk,.tr(A)=tr(QΛQ1)=tr(ΛQ1Q)=tr(Λ)A,A=tr(QΛQT)tr(ATA)=tr(QΛQTQΛQT)=tr(QΛ2QT)=tr(Λ2QTQ)=tr(Λ2):xTAx=tr(AxxT):Tr(AB)A=BTTr(AB)A=i=1mj=1naijbjii=1mj=1naij=i=1mj=1nbji=BTTr(ABATC)A=Tr(ATCAB)A=Tr(ACTATBT)A=CAB+(BATC)T=CAB+CTABT使.Frobenius:AF=Tr(AAT)tr(A)=a_{11}+...+a_{nn}=\sum\limits_{i=1}^{n} a_{ii}.\\ tr(A) = tr(A^T), 转置不改变主对角线的元素\\ tr(A + B) = tr(A) + tr(B)\\ tr(AB) = tr(BA)\\ tr(ABC) = tr(CBA) = tr(BCA)\\ \\ \operatorname{tr}((\mathbf{A}\odot\mathbf{B})^T\mathbf{C})=\operatorname{tr}((\mathbf{A})^T(\mathbf{B}\odot\mathbf{C}))\\ 矩阵乘法和迹交换 其中 ⊙ 是哈德玛积 即对应元素之积. \\ \\ \operatorname{tr}(\mathbf{A})=\sum_{k=1}^n\lambda_k, 矩阵的迹等于矩阵特征值之和.\\ \therefore tr(A)=tr(Q\Lambda Q^{-1})=tr(\Lambda Q^{-1}Q)=tr(\Lambda)\\ 若A是实对称矩阵, 则A=tr(Q\Lambda Q^{T})\\ tr(A^TA)=tr(Q\Lambda Q^{T}Q\Lambda Q^{T})=tr(Q\Lambda ^{2} Q^{T})=tr(\Lambda ^{2} Q^{T}Q)=tr(\Lambda^{2} )\\ \\ 矩阵的二次型用迹来表示: x^TAx=tr(Axx^T)\\ \\ 求导:\\ \frac{\partial Tr(AB)}{\partial A}=B^T\\ \frac{\partial Tr(AB)}{\partial A}=\frac{\partial \sum\limits_{i=1}^m\sum\limits_{j=1}^na_{ij}b_{ji}}{\partial\sum\limits_{i=1}^m\sum\limits_{j=1}^na_{ij}}=\sum\limits_{i=1}^m\sum\limits_{j=1}^nb_{ji}=B^T\\ \frac{\partial Tr(ABA^TC)}{\partial A}=\frac{\partial Tr(A^TCAB)}{\partial A}=\frac{\partial Tr(AC^TA^TB^T)}{\partial A}=CAB+(BA^TC)^T=CAB+C^TAB^T\\ \\ 若不使用求和符号 有些矩阵运算很难描述 而通过矩阵乘法和迹运算符号可以清楚地表示. \\ 例如 迹运算提供了另一种描述矩阵Frobenius范数的方式: \\ ||A||_F=\sqrt{Tr(AA^T)}

a = np.mat([
    [401, -201],
    [-800, 401]
])

np.trace(a)

802

1.3.1 特征值

eigenvalues

A 是n阶方阵 如果存在数m和非零n维列向量 x 使得 Ax=mx 成立 则称 m 是A的一个特征值(characteristic value)或本征值(eigenvalue).

https://baike.baidu.com/item/%E7%89%B9%E5%BE%81%E5%80%BC?fromModule=lemma_search-box

(AλI)X=0a11λa12a1na21a22λa2nan1an2anmλ:λ1+λ2++λn=a11+a22++annλ1λ2λn=A(A - \lambda I)X = 0\\ \left| \begin{matrix} a_{11}-\lambda & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} - \lambda & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nm} - \lambda \end{matrix} \right| \\ \\ 满足以下特性: \\ \lambda_1+\lambda_2+\cdots+\lambda_n=a_{11}+a_{22}+\cdots+a_{nn}\\ \lambda_1\lambda_2\cdots\lambda_n=|A|

linalg.eig(a)[source]

返回矩阵特征值和特征向量(标准化之后)

Compute the eigenvalues and right eigenvectors of a square array.

  • Parameters:

a(…, M, M) array

Matrices for which the eigenvalues and right eigenvectors will be computed

  • Returns:

A namedtuple with the following attributes:

eigenvalues(…, M) arrayThe eigenvalues, each repeated according to its multiplicity. The eigenvalues are not necessarily ordered. The resulting array will be of complex type, unless the imaginary part is zero in which case it will be cast to a real type. When a is real the resulting eigenvalues will be real (0 imaginary part) or occur in conjugate pairs.

eigenvectors(…, M, M) arrayThe normalized (unit " length" ) eigenvectors, such that the column eigenvectors[:,i] is the eigenvector corresponding to the eigenvalue eigenvalues[i].

a = np.mat([
    [401, -201],
    [-800, 401]
])

eigvals, eigvecs = np.linalg.eig(a)

eigvals
array([8.01998753e+02, 1.24688473e-03])

eigvecs(单位向量)
matrix([[ 0.44810624,  0.44810624],
        [-0.89398031,  0.89398031]])

# 恢复矩阵
eigvecs * np.diag(eigvals) * eigvecs.I

matrix([[ 401., -201.],
        [-800.,  401.]])

1.4 行列式

determinants

矩阵行列式是指矩阵的全部元素构成的行列式 设A=(aij)是数域P上的一个n阶矩阵 则所有A=(aij)中的元素组成的行列式称为矩阵A的行列式 记为|A|或det(A). 若A B是数域P上的两个n阶矩阵 k是P中的任一个数 则|AB|=|A||B| |kA|=kⁿ|A| |A*|=|A|n-1 其中A*是A的伴随矩阵; 若A是可逆矩阵 则|A-1|=|A|-1.

https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E8%A1%8C%E5%88%97%E5%BC%8F/18882017

A,:A,det(A)det(A)=det[a11a12a13a21a22a23a31a32a33]=a11A11+a12A12+a13A13=a11(1)1+1a22a23a32a33+a12(1)1+2a21a23a31a33+a13(1)1+3a21a22a31a32=a11(a22a33a32a23)a12(a21a33a31a23)+a13(a21a32a31a22):det(A)=det(AT)A(,),AA.An×n.(i)Adet(A)=0.(ii)Adet(A)=0.存在方阵A, 常见表示形式: |A|, det(A)\\ det(A)=det \left[\begin{array}{ccc} a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\ a_{31}&a_{32}&a_{33}\end{array}\right] =a_{11}A_{11}+a_{12}A_{12}+a_{13}A_{13} \\ =a_{11}(-1)^{1+1}\left|\begin{array}{ccc} a_{22}&a_{23}\\ a_{32}&a_{33} \end{array}\right| + a_{12}(-1)^{1+2}\left|\begin{array}{ccc} a_{21}&a_{23}\\ a_{31}&a_{33} \end{array}\right| + a_{13}(-1)^{1+3}\left|\begin{array}{ccc} a_{21}&a_{22}\\ a_{31}&a_{32} \end{array}\right| \\ =a_{11}(a_{22}a_{33}-a_{32}a_{23})-a_{12}(a_{21}a_{33}-a_{31}a_{23})+a_{13}(a_{21}a_{32}-a_{31}a_{22}) \\ \\ 存在以下特性:\\ det(A) = det(A^T)\\ A为三角矩阵(上, 下), 则A的行列式等于A的对角元素的乘积.\\ A为n×n矩阵. \\ (i) 若A有一行或一列包含的元素全为零 则det(A)=0. \\ (ii) 若A有两行或两列相等 则det(A)=0. \\

# numpy中进行行列式计算

np.linalg.det(np.mat([
    [1, 2],
    [2, 4]
]))

 0

# 转置后, 依然为0
np.linalg.det(np.mat([
    [1, 2],
    [2, 4]
]).T)

1.4.1 向量

vector

向量空间( 也称为线性空间) 是称为对象的集合的载体 其可被添加在一起 并乘以由数字( " 缩放" ) 所谓的标量. 标量通常被认为是实数 但是也存在标量乘以复数 有理数或通常任何字段的向量空间. 向量加法和标量乘法的运算必须满足下面列出的某些要求 称为公理.

欧几里德向量是向量空间的一个例子. 它们代表物理量 诸如力: 任何两个力( 同一类型的) 可被添加 以产生第三和的相乘力矢量由一实数乘法器是另一个力矢量. 同样 但在更几何意义上 表示平面或三维空间中的位移的矢量也形成矢量空间. 向量空间中的向量不一定必须是箭头状对象 因为它们出现在上述示例中: 向量被视为具有特定属性的抽象数学对象 在某些情况下可以将其视为箭头.

向量空间是线性代数的主题 并且通过它们的维度很好地表征 粗略地说 它指定了空间中独立方向的数量. 无限维向量空间在数学分析中自然出现 作为函数空间 其向量是函数. 这些向量空间通常具有附加结构 其可以是拓扑结构 允许考虑接近度和连续性问题. 在这些拓扑中 由规范或内积定义的拓扑更常用 因为它具有距离概念两个向量之间. 特别是Banach空间和Hilbert空间的情况 这是数学分析的基础.

https://en.wikipedia.org/wiki/Vector_space

标量 向量 矩阵 张量的关系

(图: 见水印)

以下内容引用自: 清雅白鹿记 - 知乎 (zhihu.com)

Ad=[a1b1c1a2b2c2a3b3c3][d1d2d3]=d1[a1a2a3]+d2[b1b2b3]+d3[c1c2c3]=d1a+d2b+d3c=[n1n2n3]=n\begin{aligned} A\vec d &= \begin{bmatrix} a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3\end{bmatrix} \begin{bmatrix} d_1 \\ d_2 \\d_3 \end{bmatrix} \\ &= d_1 \begin{bmatrix} a_1 \\ a_2 \\a_3 \end{bmatrix} +d_2 \begin{bmatrix} b_1 \\ b_2 \\b_3 \end{bmatrix} + d_3 \begin{bmatrix} c_1 \\ c_2 \\c_3 \end{bmatrix} \\ &= d_1 \vec a + d_2 \vec b + d_3 \vec c \\ &= \begin{bmatrix} n_1 \\ n_2 \\n_3 \end{bmatrix}= \vec n \end{aligned}\\ \\

dA[d1d2d3],[n1n2n3]:[n1n2n3]=A[d1d2d3]dA,a,b,cn\vec d在由矩阵A映射前后两个坐标系下的坐标\begin{bmatrix}d_1 \\ d_2 \\d_3 \end{bmatrix},\quad \begin{bmatrix} n_1 \\ n_2 \\n_3 \end{bmatrix}之间的关系是:\\ \begin{bmatrix} n_1 \\ n_2 \\n_3 \end{bmatrix} = A \begin{bmatrix} d_1 \\ d_2 \\d_3 \end{bmatrix}\\ \vec d 被映射到A的列向量, \vec a,\quad \vec b,\quad\vec c所张成的三维空间中的\vec n

1阶行列式|a|表示一维坐标轴上的有向长度.

2阶行列式表示2个行向量为邻边构成的平行四边形的有向面积;

3阶行列式表示其行向量或列向量所张成的平行六面体的有向体积

n阶行列式det A , 表示矩阵A对应的线性变换前后的面积或体积比, 还可以表示其行向量或列向量所张成的超平行多面体的有向体积.

1.5 Python原生矩阵的实现

class Matrix:
    def __init__(self, matrix):
        self.values = matrix

    def __matmul__(self, other):
        # 乘法, 其他运算类似操作
        a = self.values
        b = other.values
        return [
            [
                sum([float(i) * float(j) for i, j in zip(row, col)])
                for col in zip(*b)
            ]
            for row in a
        ]

A = [[1,2,3],[4,5,6]]
B = [[1,1], [1,1], [1,1]]

# @, 矩阵乘法的专属操作符
Matrix(A) @ Matrix(B)

[[6.0, 6.0], [15.0, 15.0]]
import numpy as np

a = np.mat(A)
b = np.mat(B)

a * b

matrix([[ 6,  6],
        [15, 15]])

二. 基本运算

2.1 加

Am×n+Bm×n=Mm×n:A+B=B+A(A+B)+C=A+(B+C)A_{m \times n} + B_{m \times n} = M_{m \times n}\\ \\ 常见特性:\\ \mathbf{A} + \mathbf{B} = \mathbf{B} + \mathbf{A}\\ \left ( \mathbf{A} + \mathbf{B}\right ) + \mathbf{C} = \mathbf{A} + \left ( \mathbf{B} + \mathbf{C} \right )

2.2 乘

Am×pBp×n=Mm×nA_{m \times p} * B_{p \times n} = M_{m \times n}

a.shape
(2, 3)

b.shape
(3, 2)

:(AB)C=A(BC)(A+B)C=AC+BCC(A+B)=CA+CBk(AB)=(kA)B=A(kB)乘法常见特性:\\ (AB)C = A(BC)\\ (A + B)C = AC + BC\\ C(A+B)=CA+CB\\ k(AB) =(kA)B=A(kB)\\

三. 转置

transpose

Am×n=[a11a12a1na21a22a2nam1am2amn]ATn×m=[a11a21am1a12a22am2a1na2namn](AB)T=BTAT(A+B)T=AT+BT(kA)T=kAT(AT)T=A(A1A2..An)T=AnT..A2TA1T\underset{m\times n}{\mathbf{A}} = \begin{bmatrix}a_{11} & a_{12} & \ldots & a_{1n} \\ a_{21} & a_{22} & \ldots & a_{2n} \\ \ldots \\ a_{m1} & a_{m2} & \ldots & a_{mn}\end{bmatrix}\\ \\ \underset{n\times m}{A^{T}} = \begin{bmatrix}a_{11} & a_{21} & \ldots & a_{m1} \\ a_{12} & a_{22} & \ldots & a_{m2} \\ \ldots \\ a_{1n} & a_{2n} & \ldots & a_{mn}\end{bmatrix}\\ \\ (AB)^T=B^TA^T\\ (A + B) ^ T = A^T + B^T\\ (k\mathbf{A})^{T}=k\mathbf{A}^{T}\\ (\mathbf{A}^{T})^{T}=\mathbf{A}\\ (A_1A_2..A_n)^T = A_n^T..A_2^TA_1^T\\

3.1 转置共轭

Conjugate transpose

共轭转置 一般指的是m*n型矩阵A做的一种数学变换 其中矩阵A中的任一元素a_ij属于复数域C. 符号: 与普通转置右角标T相对应 通常用H右角标或*右角标来表示共轭转置 共轭转置后的矩阵A^H称为A的共轭转置矩阵 A^H为n*m型. 具体操作方法: 首先将A中的每个元素a_ij取共轭得b_ij 将新得到的由b_ij组成的新m*n型矩阵记为矩阵B再对矩阵B作普通转置得到B^T即为A的共轭转置矩阵: B ^ T=A ^ H

共轭转置_百度百科 (baidu.com)

一般来讲A^T表示转置 A^H表示转置共轭, 对实矩阵而言是一回事, 对复矩阵而言转置共轭比单纯的转置更常用一些 比如酉变换, Hermite型等.

四. 逆矩阵

inverse.

p9Rj20U.png

可逆条件

  • 矩阵A可逆的充要条件是A的行列式不等于0.
  • 可逆矩阵一定是方阵.
  • 如果矩阵A是可逆的 A的逆矩阵是唯一的.
  • 可逆矩阵也被称为非奇异矩阵 满秩矩阵.
  • 两个可逆矩阵的乘积依然可逆.
  • 可逆矩阵的转置矩阵也可逆.
  • 矩阵可逆当且仅当它是满秩矩阵.

作者: horu
链接: https://www.jianshu.com/p/001806827975

p9RjBfs.png

:AB=BA=IA=B1B=A1(AB)1=B1A1,A,B,(A1)T=(AT)1:AA1=I=A1A;:Aleft1A=IAAleft1;:AAright1=IAright1A;逆矩阵: AB = BA = I\\ A = B ^{-1}\\ B = A ^{-1}\\ (AB) ^{-1} = B^{-1}A^{-1}, A, B同阶, 可逆\\ (A^{-1})^T=(A^T)^{-1}\\ 双侧可逆:AA^{-1} = I = A^{-1}A;\\ 左侧可逆:A^{-1}_{left}A = I \neq AA^{-1}_{left};\\ 右侧可逆: AA^{-1}_{right} = I \neq A^{-1}_{right}A;

4.1 伪逆矩阵

Pseudoinverse Matrix, 或者称为广义逆矩阵.

奇异矩阵非方阵没有逆矩阵 但可以有伪逆矩阵.

p9Rjfk4.png
p9RjgmT.png

:x=pinv(A);xAx=xAxA=A满足以下特性:\\ x = pinv(A);\\ x * A * x = x\\ A * x * A = A

4.2 inv & pinv

Compute the (multiplicative) inverse of a matrix.

Given a square matrix a, return the matrix ainv satisfying dot(a, ainv) = dot(ainv, a) = eye(a.shape[0]).

https://numpy.org/doc/stable/reference/generated/numpy.linalg.inv.html

Compute the (Moore-Penrose) pseudo-inverse of a matrix.

Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

https://numpy.org/doc/stable/reference/generated/numpy.linalg.pinv.html

import numpy as np

m = np.mat([
    [1, 2],
    [3, 4]
])

m.I

matrix([[-2. ,  1. ],
        [ 1.5, -0.5]])

np.linalg.inv(m)

matrix([[-2. ,  1. ],
        [ 1.5, -0.5]])

np.linalg.pinv(m)

matrix([[-2. ,  1. ],
        [ 1.5, -0.5]])

m * m.I

matrix([[1.00000000e+00, 1.11022302e-16],
        [0.00000000e+00, 1.00000000e+00]])

# 构造一个不可逆的矩阵
n = np.mat([
    [1, 2],
    [2, 4]
])

n.I
---------------------------------------------------------------------------
LinAlgError

np.linalg.pinv(n)
matrix([[0.04, 0.08],
        [0.08, 0.16]])

n * np.linalg.pinv(n)
matrix([[0.2, 0.4],
        [0.4, 0.8]])

n * np.linalg.pinv(n)*n

matrix([[1., 2.],
        [2., 4.]])

np.linalg.pinv(n) * n * np.linalg.pinv(n)

matrix([[0.04, 0.08],
        [0.08, 0.16]])

4.3 奇异矩阵

奇异矩阵是线性代数的概念, 就是该 矩阵的秩不是满秩. 首先, 看这个矩阵是不是方阵(即行数和列数相等的矩阵, 若行数和列数不相等, 那就谈不上奇异矩阵和 非奇异矩阵 ). 然后, 再看此矩阵的 行列式 |A|是否等于0, 若等于0, 称矩阵A为奇异矩阵; 若不等于0, 称矩阵A为非奇异矩阵. 同时, 由|A|≠0可知矩阵A可逆, 这样可以得出另外一个重要结论: 可逆矩阵 就是非奇异矩阵, 非奇异矩阵也是可逆矩阵. 如果A为奇异矩阵, 则AX=0有无穷解, AX=b有无穷解或者无解. 如果A为非奇异矩阵, 则AX=0有且只有唯一 零解 , AX=b有唯一解.

# 计算上述的n矩阵

np.linalg.det(n)

0

4.4 OLS

在之前的文章, 最小二乘的的normal equations:

w^=(XTX)1XTy=X1(XT)1XTy\hat{w}^* = (X^TX)^{-1}X^Ty\\ = X^{-1}(X^T)^{-1}X^Ty

import numpy as np

y =np.array([
    3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
    11, 13, 13, 16, 17, 18, 17, 19, 21
])

y = y[:, np.newaxis]

x = np.array([[e, 1] for e in range(1, 21)])

np.linalg.lstsq(x, y, rcond=1e-5)

(array([[0.96992481],
        [0.51578947]]),
 array([40.59849624]),
 2,
 array([53.71583167,  2.14695784]))

# 使用逆矩阵求解
np.linalg.pinv(x).dot(y)

array([[0.96992481],
       [0.51578947]])

np.mat(x).I*np.mat(y)

matrix([[0.96992481],
        [0.51578947]])
p9Wn7vV.png

A:A+=limα0(ATA+αI)1AT=VD+UTUDV.DD+.A使线.,x=A+yx2.A.x使AxyAxy2.矩阵A伪逆: A^+ = \lim_{\alpha\rightarrow 0}(A^TA + \alpha I)^{-1}A^T\\ = VD^+U^T\\ 其中 矩阵U D V是矩阵奇异值分解后得到的矩阵.\\ 对角矩阵D的伪逆D^+是其非零元素取倒数之后再转置得到的.\\ 当矩阵A的列数多于行数时 使用伪逆求解线性方程是众多可能解法中的一种. \\ 特别的, x = A^+y是方程所有可行解中欧几里得范数||x||_2最小的一个.\\ 当矩阵A的行数多于列数时 可能没解. \\ 在这种情况下 通过伪逆得到的x使得Ax和y的欧几里得距离||Ax - y||_2最小.

详细的矩阵推导过程见下面的矩阵推导部分的内容.

五. 特殊矩阵

5.1 单位矩阵

identity matrix

单位矩阵:(一般使用I, E来表示)I=[100010001]IA=AI=A.\text{单位矩阵:(一般使用I, E来表示)}\\ I= \begin{bmatrix} 1 & 0 & \cdots & 0\\ 0 & 1 & \cdots & 0\\ \vdots&\vdots & \ddots & \vdots\\ 0 & 0 & \cdots & 1 \end{bmatrix}\\\\ 任意的矩阵相乘 IA = AI = A\\ 单位矩阵的逆矩阵是其本身.

5.2 对角矩阵

diagonal matrix

也成为: 缩放矩阵

线0.A=[a11a22a33a44],  diag(a11,a22...)=A:AT=A[a0000b0000c0000d][1a00001b00001c00001d]=[1000010000100001]线0,[a000a000a][hijlmnopq]=[hijlmnopq][a000a000a]=a[hijlmnopq]=[ahaiajalamanaoapaq]:(aA)T=ATa=aATAm×pBp×n=Mm×n,Mm×n:x,ym,n[m00n][xy]=[mxny]除了对角线之外的元素全部为0.\\ A = \begin{bmatrix} a_{11} & & & \\ & a_{22} & & \\ & & a_{33}&\\ & & &a_{44} \end{bmatrix}, \;常见表示diag(a_{11}, a_{22}...) = A\\ 对角矩阵的转置等于自身: A^T = A\\ \begin{bmatrix} a & 0&0&0\\ 0 & b&0&0\\ 0 &0&c&0\\ 0 & 0&0&d \end{bmatrix} \begin{bmatrix} \frac{1}{a} & 0&0&0\\ 0 & \frac{1}{b}&0&0\\ 0 &0&\frac{1}{c}&0\\ 0 & 0&0&\frac{1}{d} \end{bmatrix} =\begin{bmatrix} 1& 0&0&0\\ 0 & 1&0&0\\ 0 &0&1&0\\ 0 & 0&0&1 \end{bmatrix}\\ 若对角矩阵的对角线上含有值为0的元素, 则该对角矩阵不可逆\\\\ \begin{bmatrix} a & 0&0\\ 0 & a&0\\ 0 &0&a \end{bmatrix} \begin{bmatrix} h & i&j\\ l& m&n\\ o &p&q\end{bmatrix}=\begin{bmatrix} h & i&j\\ l& m&n\\ o &p&q\end{bmatrix}\begin{bmatrix} a & 0&0\\ 0 & a&0\\ 0 &0&a \end{bmatrix} =a*\begin{bmatrix} h & i&j\\ l& m&n\\ o &p&q\end{bmatrix} =\begin{bmatrix} ah & ai&aj\\ al& am&an\\ ao &ap&aq\end{bmatrix}\\ 常数: (a\bold{A})^T=\bold{A}^Ta=a\bold{A}^T\\ \\ 两个对角矩阵A_{m \times p} * B_{p \times n} = M_{m \times n}, M_{m \times n}也为对角矩阵\\ 缩放的来源:实现对x, y的m, n倍的缩放\\ \begin{bmatrix} m & 0\\ 0 & n \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} m* x\\ n * y \end{bmatrix}\\

5.3 正交矩阵

orthogonal matrix

ATA=I,A.AA1=AT,  AA1=IA=[abcd]AT=[acbd]AAT=[aa+bbac+bdca+dbcc+dd]=[1001]:ac+bd=ca+bd=0,aa+bb=cc+dd=1A:i=(a,b)j=(c,d)ij=ac+bd=0i=aa+bb=1,i1,;j=1A^TA = I, 则称A为正交矩阵.\\ 正交矩阵A的逆矩阵A^{-1} = A^T, 即\;AA^{-1} = I \\ \mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}\\ \mathbf{A}^{T} = \begin{bmatrix} a & c \\ b & d \end{bmatrix}\\ \mathbf{A} \mathbf{A}^{T} = \begin{bmatrix} aa+bb & ac+bd \\ ca+db & cc+dd \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\\ 即: ac+bd=ca+bd = 0, aa+bb=cc+dd= 1\\ \\ A按行取向量:\\ \vec{i}=(a,b)\\ \vec{j}=(c,d)\\ \vec{i}\cdot \vec{j}=ac+bd = 0\\ | \vec{i} |=\sqrt{aa+bb} = 1, \vec{i}的模长为\: 1, 单位向量; 同理\vec{j} = 1\\

5.4 三角矩阵

A=[a11a12a1na22a2nann],线0;,线0.,.线.A= \left[ \begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1n} \\ &a_{22} & \cdots &a_{2n} \\ & & \ddots & \vdots \\ & & &a_{nn} \end{array}\right]\\ 分为上三角, 对角线下方的元素全部为0; 下三角, 对角线上方的元素为0.\\ 上三角的转置为下三角, 反之亦然.\\ 三角矩阵的行列式等于角线上元素的积.\\

5.5 对称矩阵

5.5.1 对角矩阵

A=[λ11λ22λ33λ44],  diag(λ11,λ22...)=A,,0,线0.线1,.A = \begin{bmatrix} \lambda_{11} & & & \\ & \lambda_{22} & & \\ & & \lambda_{33}&\\ & & &\lambda_{44} \end{bmatrix}, \;常见表示diag(\lambda_{11}, \lambda_{22}...) = A\\ 对角矩阵, 除了主对角的元素, 其他为0, 主对角线中其他元素可以为0. 当对角线元素为1, 即为单位矩阵.

AT=A,A,P,Λ,:P1AP=ΛA^T = A, A为对称矩阵, 一定存在正交矩阵P, 对角矩阵\Lambda, 满足以下:\\ P^{-1}AP=\Lambda

5.6 Hermite矩阵

AH=AA^H=A\\ 特征值都是实数\\ 任意两个不同特征值所对应的特征向量正交\\

5.7 酉矩阵

n阶复方阵U的n个列向量是U空间的一个标准正交基 则U是酉矩阵(Unitary Matrix). 显然酉矩阵是正交矩阵往复数域上的推广.

AHA=AHA=IA^HA = A^HA = I

5.8 正定矩阵

positive definite matrix

在线性代数里 正定矩阵 (positive definite matrix) 有时会简称为正定阵. 在线性代数中 正定矩阵的性质类似复数中的实数. 与正定矩阵相对应的线性算子对称正定双线性形式( 复域中则对应埃尔米特正定双线性形式) .

( 1) 正定矩阵的行列式恒为正;

( 2) 实对称矩阵A正定当且仅当A与单位矩阵合同;

( 3) 若A是正定矩阵 则A的逆矩阵也是正定矩阵;

( 4) 两个正定矩阵的和是正定矩阵;

( 5) 正实数与正定矩阵的乘积是正定矩阵.

https://baike.baidu.com/item/%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/11030459

六. 范数

norm

范数 是具有" 长度" 概念的函数. 在线性代数 泛函分析及相关的数学领域 范数是一个函数 是矢量空间内的所有矢量赋予非零的正长度或大小. 半范数可以为非零的矢量赋予零长度. 定义范数的矢量空间是赋范矢量空间; 同样 定义半范数的矢量空间就是赋半范矢量空间. 注: 在二维的欧氏几何空间 R中定义欧氏范数 在该矢量空间中 元素被画成一个从原点出发的带有箭头的有向线段 每一个矢量的有向线段的长度即为该矢量的欧氏范数.

https://baike.baidu.com/item/%E8%8C%83%E6%95%B0

L0(0):x0=;L1(1):x1=i=1mxi=x1++xmL2(Euclidean,Frobenius):x2=(x12++xm2)12L2,L(,):x=max{x1,,xm}L_0范数(0范数): ||x||_0 = 非零元素的个数;\\ L_1范数(和范数或1范数): \left| \left| x \right| \right|_{1}=\sum_{i=1}^{m}{\left| x_{i} \right|}=\left| x_{1} \right|+\cdot\cdot\cdot+\left| x_{m} \right|\\ L_2范数(Euclidean范数, Frobenius范数): \left| \left| x \right| \right|_{2} = (\left| x_{1} \right|^{2}+\cdot\cdot\cdot+\left| x_{m} \right|^{2})^{\frac{1}{2}}\\ L_2范数, 最为常见\\ L_{\infty}范数(极大范数, 无穷大范数): \left| \left| x \right| \right|_{\infty}=max\left\{ \left| x_{1} \right| ,\cdot\cdot\cdot, \left| x_{m} \right| \right\}\\

七. 病态矩阵

线:[400200800401][x1x2]=[200200]假设有这样的线性方程:\\ \begin{bmatrix} 400& -200\\ -800 & 401 \end{bmatrix} \begin{bmatrix} x_1\\ x_2 \end{bmatrix} = \begin{bmatrix} 200\\ -200 \end{bmatrix}

import numpy as np

a = np.mat([
    [400, -201],
    [-800, 401]
])
b = np.mat([
    [200],
    [-200]
])

np.linalg.solve(a, b)

matrix([[-100.],
        [-200.]])

:[401200800401][x1x2]=[200200]对上面的方程进行轻微的改动:\\ \begin{bmatrix} 401& -200\\ -800 & 401 \end{bmatrix} \begin{bmatrix} x_1\\ x_2 \end{bmatrix} = \begin{bmatrix} 200\\ -200 \end{bmatrix}

# 将400改成401
a = np.mat([
    [401, -201],
    [-800, 401]
])
np.linalg.solve(a, b)

# 得到新的解和原来的解, 将发生巨大的改变, 虽然只是简单改动一个数
matrix([[40000.00000034],
        [79800.00000068]])

假如出现上述的情形, 则称这样的方程组/矩阵为病态的 (ill-conditioned).

八. 矩阵求导

p9fA8xO.png

Ew^=(yXw^)T(yXw^):Ew^=yTyyTXw^w^TXTy+w^TXTXw^:Ew^w^=yTyw^yTXw^w^w^TXTyw^+w^TXTXw^w^E_{\hat{w}} = (y - X\hat{w})^T(y - X\hat{w})\\ \\ 展开上述式子:\\ E_{\hat{w}} = y^Ty - y^TX\hat{w} -\hat{w}^TX^Ty + \hat{w}^TX^TX\hat{w}\\ 求导:\\ \frac{\partial E_{\hat{w}}}{\partial \hat{w}} = \frac{\partial y^Ty }{\partial \hat{w}} - \frac{\partial y^TX\hat{w} }{\partial \hat{w}} - \frac{\partial \hat{w}^TX^Ty }{\partial \hat{w}} + \frac{\partial \hat{w}^TX^TX\hat{w} }{\partial \hat{w}}\\

p9feoN9.png

Ew^w^=yTyw^(yTX)w^w^w^T(XTy)w^+w^T(XTX)w^w^:(XTy)Tw^w^=w^T(XTy)w^=XTyw^T(XTX)w^w^=(A+AT)w^Ew^w^=0XTyXTy(XTX+(XTX)T)w^=2XT(Xw^y)Ew^w^=0:,X,.2XTXw^=2XTyXTXw^=XTy(XT)1XTXw^=(XT)1XTyXw^=(XT)1XTyX1Xw^=X1(XT)1XTyw^=X1(XT)1XTy=(XTX)1XTyw^=(XTX)1XTy=X1(XT)1XTy=X1y\frac{\partial E_{\hat{w}}}{\partial \hat{w}} = \frac{\partial y^Ty }{\partial \hat{w}} - \frac{\partial (y^TX)\hat{w} }{\partial \hat{w}} - \frac{\partial \hat{w}^T(X^Ty) }{\partial \hat{w}} + \frac{\partial \hat{w}^T(X^TX)\hat{w} }{\partial \hat{w}}\\ 根据矩阵的微分公式: \frac{\partial (X^Ty)^T\hat{w} }{\partial \hat{w}} = \frac{\partial \hat{w}^T(X^Ty) }{\partial \hat{w}} = X^Ty\\ \frac{\partial \hat{w}^T(X^TX)\hat{w} }{\partial \hat{w}} = (A + A^T)\hat{w}\\ \frac{\partial E_{\hat{w}}}{\partial \hat{w}} = 0 - X^Ty - X^Ty - (X^TX + (X^TX)^T)\hat{w} = 2X^T(X\hat{w} - y)\\ 令\frac{\partial E_{\hat{w}}}{\partial \hat{w}} = 0\\ \\ 逐步化简:\\ 这里需要注意这里建立在, X不是奇异矩阵, 可逆.\\ 2X^TX\hat{w} = 2 X^Ty\\ X^TX\hat{w} = X^Ty\\ (X^T)^{-1}X^TX\hat{w} = (X^T)^{-1}X^Ty\\ X\hat{w} = (X^T)^{-1}X^Ty\\ X^{-1}X\hat{w} = X^{-1}(X^T)^{-1}X^Ty\\ \hat{w} = X^{-1}(X^T)^{-1}X^Ty = (X^TX)^{-1}X^Ty\\ \\ \hat{w}^* = (X^TX)^{-1}X^Ty = X^{-1}(X^T)^{-1}X^Ty = X^{-1}y

PCA&SVD-摘要 | Lian (kyouichirou.github.io), 已经讨论过为什么在实际的计算中, 并不会直接使用上述的normal equations来计算相关性系数, 而是采用svd的方式.

w^=(XTX)1XTyX,X1,X.svd:u,s,v=svd(X)w^=v(s2)1suTy\hat{w}^* = (X^TX)^{-1}X^Ty\\ X的逆, X^{-1}的计算是很费时间, 同时意味着上述的公式是建立在X存在逆的前提的基础之上的.\\ 将上述公式转换为svd形式:\\ u, s, v = svd(X)\\ \hat{w}^* = v(s ^ 2)^{-1} s*u^T * y\\

import numpy as np

def svd_ols(A, b):
    u, s, v = np.linalg.svd(A, full_matrices=False)
    s = np.mat(np.diag(s))
    v = np.mat(v)
    u = np.mat(u)
    return  v.T * (s ** 2).I * s * u.T * b

y =np.array([
    3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
    11, 13, 13, 16, 17, 18, 17, 19, 21
])
y = y[:, np.newaxis]

x = np.array([[e, 1] for e in range(1, 21)])

svd_ols(x, y)

matrix([[0.96992481],
        [0.51578947]])
p9WuUx0.png

尽管svd解决了X的逆的问题, 但对于巨型数据, 速度还是不够快, 梯度下降这些使用模拟逼近最优(局部/全局)的方式因应而生, 详情见: 机器学习-梯度下降的简单理解 | Lian (kyouichirou.github.io)

九. SciPy稀疏矩阵

img

稀疏矩阵( sparse matrix ) 指的是绝大多数数值为零的矩阵. 反之 如果大部分元素都非零 则称为稠密矩阵( Dense ), 在实际的计算中, 稀疏矩阵是非常常见的, 由于大部分的内容为0, 即大量的内存空间被浪费.

from scipy import sparse

sparse?
'''
.. autosummary::
   :toctree: generated/

   bsr_matrix - Block Sparse Row matrix
   coo_matrix - A sparse matrix in COOrdinate format
   csc_matrix - Compressed Sparse Column matrix
   csr_matrix - Compressed Sparse Row matrix
   dia_matrix - Sparse matrix with DIAgonal storage
   dok_matrix - Dictionary Of Keys based sparse matrix
   lil_matrix - Row-based list of lists sparse matrix
   spmatrix - Sparse matrix base class
'''
# 构造一个稀疏矩阵
# 行列坐标
row = [1, 3, 0, 2, 4]
col = [1, 4, 2, 3, 3]

# 每个坐标存储的元素
data = [2, 5, 9, 1, 6]

m = sparse.coo_matrix((data, (row, col)), shape=(6, 7))

m.data
array([2, 5, 9, 1, 6])

m.toarray()
array([[0, 0, 9, 0, 0, 0, 0],
       [0, 2, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 5, 0, 0],
       [0, 0, 0, 6, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]])

mdata = m.toarray()

# 压缩
n = sparse.csr_matrix(mdata)

n.data

array([9, 2, 1, 5, 6], dtype=int32)

print(n)
(0, 2)	9
(1, 1)	2
(2, 3)	1
(3, 4)	5
(4, 3)	6

n.toarray()
array([[0, 0, 9, 0, 0, 0, 0],
       [0, 2, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 5, 0, 0],
       [0, 0, 0, 6, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=int32)

十. numpy-linalg(线性代数)

numpy, python科学计算基石之一.

10.1 矩阵和向量积

方法 描述
doto(a, b[, out]) 两个数组的点积.
linalg(arrays) 在单个函数调用中计算两个或更多数组的点积 同时自动选择最快的求值顺序.
vdot(a, b) 返回两个向量的点积.
inner(a, b) 两个数组的内积.
outer(a, b[, out]) 计算两个向量的外积.
matmul(x1, x2, /[, out, casting, order, …]) 两个数组的矩阵乘积.
tensordot(a, b[, axes]) 沿指定轴计算张量点积.
einsum(subscripts, *operands[, out, dtype, …]) 计算操作数上的爱因斯坦求和约定.
einsum_path(subscripts, *operands[, optimize]) 通过考虑中间数组的创建 计算einsum表达式的最低成本压缩顺序.
linalg.matrix_power(a, n) 将方阵提升为(整数)n次方.
kron(a, b) 两个数组的Kronecker乘积.

10.2 分解

方法 描述
linalg.cholesky(a) Cholesky分解
linalg.qr(a[, mode]) 计算矩阵的QR分解.
linalg.svd(a[, full_matrices, compute_uv, …]) 奇异值分解

10.3 矩阵特征值

方法 描述
linalg.eig(a) 计算方阵的特征值和右特征向量.
linalg.eigh(a[, UPLO]) 返回复数Hermitian( 共轭对称) 或实对称矩阵的特征值和特征向量.
linalg.eigvals(a) 计算通用矩阵的特征值.
linalg.eigvalsh(a[, UPLO]) 计算复杂的Hermitian或实对称矩阵的特征值.

10.4 范数和其他数字

方法 描述
linalg.norm(x[, ord, axis, keepdims]) 矩阵或向量范数.
linalg.cond(x[, p]) 计算矩阵的条件数.
linalg.det(a) 计算数组的行列式.
linalg.matrix_rank(M[, tol, hermitian]) 使用SVD方法返回数组的矩阵的rank
linalg.slogdet(a) 计算数组行列式的符号和( 自然) 对数.
trace(a[, offset, axis1, axis2, dtype, out]) 返回数组对角线的和.

10.5 解方程和逆矩阵

方法 描述
linalg.solve(a, b) 求解线性矩阵方程或线性标量方程组.
linalg.tensorsolve(a, b[, axes]) 对x求解张量方程a x = b.
linalg.lstsq(a, b[, rcond]) 返回线性矩阵方程的最小二乘解.
linalg.inv(a) 计算矩阵的( 乘法) 逆.
linalg.pinv(a[, rcond, hermitian]) 计算矩阵的( Moore-Penrose) 伪逆.
linalg.tensorinv(a[, ind]) 计算N维数组的" 逆" .

10.6 异常

方法 描述
linalg.LinAlgError 泛型Python-linalg函数引发的异常派生对象.

十一. 参考

  • < 机器学习实战: 基于Scikit-Learn Keras和TensorFlow 第二版 >, 奥雷利安- 杰龙
  • < 矩阵分析与应用 第二版>, 张贤达

非常好的工具书.

p9W37FS.png