1. 正定矩阵的判定标准

目前我们有 5 种方法判断矩阵是否为正定矩阵:

  • 所有的特征值大于零: λ i > 0 \lambda_i>0 λi>0
  • 对于所有的非零向量x,能量方程大于零, x T S x > 0 x^TSx>0 xTSx>0
  • S = A T A S=A^TA S=ATA,当矩阵A列满秩
  • 所有的顺序主子式均大于零, D i > 0 D_i>0 Di>0
  • 所有的主元均大于零, P i v o t i > 0 Pivot_i>0 Pivoti>0

2. 非正定矩阵

  • 假设我们有一个矩阵S,判断其是否为正定矩阵
    S = [ 3 4 4 5 ] → ∣ S ∣ = − 1 → S 非正定矩阵 \begin{equation} S=\begin{bmatrix} 3&4\\\\ 4&5 \end{bmatrix}\rightarrow |S|=-1\rightarrow S非正定矩阵 \end{equation} S= 3445 S=1S非正定矩阵
  • 假设我们有一个矩阵S,判断其是否为正定矩阵
    S = [ 3 4 4 16 3 ] → ∣ S ∣ = 0 → S 为半正定矩阵 \begin{equation} S=\begin{bmatrix} 3&4\\\\ 4&\frac{16}{3} \end{bmatrix}\rightarrow |S|=0\rightarrow S 为半正定矩阵 \end{equation} S= 344316 S=0S为半正定矩阵

3. 能量方程

假设我们有如下能量方程,绘出其图像:
S = f ( x , y ) = [ x y ] [ 3 4 4 6 ] [ x y ] = 3 x 2 + 8 x y + 6 y 2 \begin{equation} S=f(x,y)=\begin{bmatrix} x&y \end{bmatrix}\begin{bmatrix} 3&4\\\\ 4&6 \end{bmatrix}\begin{bmatrix} x\\\\y \end{bmatrix}=3x^2+8xy+6y^2 \end{equation} S=f(x,y)=[xy] 3446 xy =3x2+8xy+6y2

  • 函数的梯度表示如下:
    [ ∂ f ( x , y ) ∂ x ∂ f ( x , y ) ∂ y ] = [ 6 x + 8 y 8 x + 12 y ] \begin{equation} \begin{bmatrix} \frac{\partial f(x,y)}{\partial x}\\\\ \frac{\partial f(x,y)}{\partial y} \end{bmatrix}=\begin{bmatrix} 6x+8y\\\\ 8x+12y \end{bmatrix} \end{equation} xf(x,y)yf(x,y) = 6x+8y8x+12y
    在这里插入图片描述
  • 深度学习梯度下降示意图
    如何通俗地解释梯度下降法
    我们通常情况下,损失函数会用二次型加上非线性函数,所以我们深度学习的主要目的是在损失函数图上通过梯度下降法来找到最小损失,具体解释看链接。

3. 正定方程

  • 假设S,T均为正定矩阵,那S+T是否为正定矩阵呢?
    x T S x > 0 , x T T x > 0 → x T ( S + T ) x = x T S x + x T T x > 0 \begin{equation} x^TSx>0,x^TTx>0\rightarrow x^T(S+T)x=x^TSx+x^TTx>0 \end{equation} xTSx>0,xTTx>0xT(S+T)x=xTSx+xTTx>0
    所以S+T为正定矩阵
  • 假设S是正定矩阵,Q为正交矩阵, Q T Q = I Q^TQ=I QTQ=I,请问 Q T S Q Q^TSQ QTSQ是否是正定矩阵?
    Q T S Q = Q − 1 S Q = A → A ∼ S → λ A = λ S → A 为正定矩阵 \begin{equation} Q^TSQ=Q^{-1}SQ=A\rightarrow A\sim S \rightarrow \lambda_A=\lambda_S\rightarrow A为正定矩阵 \end{equation} QTSQ=Q1SQ=AASλA=λSA为正定矩阵
    Q T S Q → x T Q T S Q x = ( Q x ) T S ( Q x ) > 0 \begin{equation} Q^TSQ\rightarrow x^TQ^TSQx=(Qx)^TS(Qx)>0 \end{equation} QTSQxTQTSQx=(Qx)TS(Qx)>0

4. 半正定矩阵

假设矩阵A表示如下:
A = [ 1 1 1 1 1 1 1 1 1 ] → r a n k ( A ) = 1 → N ( A ) = 3 − 1 = 2 \begin{equation} A=\begin{bmatrix} 1&1&1\\\\ 1&1&1\\\\ 1&1&1 \end{bmatrix}\rightarrow rank(A)=1\rightarrow N(A)=3-1=2 \end{equation} A= 111111111 rank(A)=1N(A)=31=2

  • 也就是说矩阵A有两个零向量, A x 1 = 0 x 1 , A x 2 = 0 x 2 → λ 1 = λ 2 = 0 , λ 3 = 1 + 1 + 1 − 0 = 3 Ax_1=0x_1,Ax_2=0x_2\rightarrow \lambda_1=\lambda_2=0,\lambda_3=1+1+1-0=3 Ax1=0x1,Ax2=0x2λ1=λ2=0,λ3=1+1+10=3,所以矩阵A为半正定矩阵。
  • 可以将矩阵分解如下:
    A = λ 1 q 1 q 1 T + λ 2 q 2 q 2 T + λ 3 q 3 q 3 T = λ 3 q 3 q 3 T \begin{equation} A=\lambda_1q_1q_1^T+\lambda_2q_2q_2^T+\lambda_3q_3q_3^T=\lambda_3q_3q_3^T \end{equation} A=λ1q1q1T+λ2q2q2T+λ3q3q3T=λ3q3q3T
    A = 3 [ 1 3 1 3 1 3 ] [ 1 3 1 3 1 3 ] \begin{equation} A=3\begin{bmatrix} \frac{1}{\sqrt{3}}\\\\ \frac{1}{\sqrt{3}}\\\\ \frac{1}{\sqrt{3}} \end{bmatrix}\begin{bmatrix} \frac{1}{\sqrt{3}}& \frac{1}{\sqrt{3}}& \frac{1}{\sqrt{3}} \end{bmatrix} \end{equation} A=3 3 13 13 1 [3 13 13 1]

5. python 代码测试

  • 代码
import numpy as np
from abc import ABCMeta, abstractmethod

np.set_printoptions(suppress=True, precision=True)


class SMatrix(object):
    def __init__(self, my_matrix):
        self.matrix = my_matrix
        self.is_positive = False

    def is_positive_method(self):
        result = np.linalg.eigvals(self.matrix)
        e_value = np.diag(result)
        result = np.all(result > 0)
        self.is_positive = result
        print("*" * 50)
        print(f"result={result}")
        print(f"e_value\n={e_value}")
        print(f"matrix=\n{self.matrix} is {self.is_positive} positive")
        print("*" * 50)
        return result


class NumpyXtsx(object):
    def __init__(self, my_matrix, my_vector):
        self.matrix = my_matrix
        self.vector = my_vector

    def get_result(self):
        result = self.vector.T @ self.matrix @ self.vector
        new_result = self.matrix[0, 0] * self.vector[0] ** 2 + (self.matrix[0, 1] + self.matrix[1, 0]) * self.vector[0] * self.vector[1] + self.matrix[1, 1] * self.vector[1] ** 2
        print(f"vector.T={self.vector.T};\nmatrix=\n{self.matrix},\nvector={self.vector}")
        print(f"result={result}")
        print(f"new_result={new_result}")


if __name__ == "__main__":
    my_code = 0
    s_matrix = np.array([[3, 4], [4, 5]])
    s_matrix2 = np.array([[3, 4], [4, 6]])
    s_matrix3 = np.array([[-3, 4], [4, -6]])
    my_list = [s_matrix, s_matrix2, s_matrix3]
    for matrix in my_list:
        matrix_clas = SMatrix(matrix)
        matrix_clas.is_positive_method()
    s_vector = np.array([1, 2])
    s_xtsx = NumpyXtsx(s_matrix, s_vector)
    s_xtsx.get_result()
  • 结果:
**************************************************
result=False
e_value
=[[-0.1  0. ]
 [ 0.   8.1]]
matrix=
[[3 4]
 [4 5]] is False positive
**************************************************
**************************************************
result=True
e_value
=[[0.2 0. ]
 [0.  8.8]]
matrix=
[[3 4]
 [4 6]] is True positive
**************************************************
**************************************************
result=False
e_value
=[[-0.2  0. ]
 [ 0.  -8.8]]
matrix=
[[-3  4]
 [ 4 -6]] is False positive
**************************************************
vector.T=[1 2];
matrix=
[[3 4]
 [4 5]],
vector=[1 2]
result=39
new_result=39
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐