矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质) 您所在的位置:网站首页 实对称矩阵的公式 矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)

矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)

2024-07-16 21:56| 来源: 网络整理| 查看: 265

文章目录 1. 前言2.矩阵的进阶知识2.1 特征分解(谱分解)=>只可以用在方阵上2.1.1 特征分解的原理2.1.2 特征分解的合理性2.1.3 特征分解的计算2.1.4 对称矩阵的特征分解(这个性质后面SVD推导用到)

1. 前言

要学会矩阵的特征分解,可以提前看矩阵的一些基础知识: https://blog.csdn.net/qq_30232405/article/details/104588293

2.矩阵的进阶知识 2.1 特征分解(谱分解)=>只可以用在方阵上 2.1.1 特征分解的原理

如果说一个向量 v v v是方阵 A A A的特征向量,将一定可以表示成下面的形式: A v = λ v (2-1) Av=\lambda v \tag{2-1} Av=λv(2-1)

这种形式在数学上的含义:描述的是矩阵 A A A对向量 v v v的变换效果只有拉伸,没有旋转。(因为 λ \lambda λ这个值是一个数值)这时候 λ \lambda λ就被称为特征向量 v v v对应的特征值

也可以看成矩阵 A A A,向量 v v v,系数 λ \lambda λ这三者建立了一种联系,但显然我们无法通过式(2-1)来用 v v v和 λ \lambda λ表示 A A A,因为这个式子不是完备的,对于一个秩为 m m m的矩阵 A A A,应该存在 m m m个这样的式子,完备式子应该是: A ( v 1 , v 2 , . . . , v m ) = ( λ 1 v 1 , λ 2 v 2 , . . . , λ m v m ) = ( v 1 , v 2 , . . . , v m ) [ λ 1 . . . 0 ⋮ ⋱ ⋮ 0 . . . λ m ] A(v_1,v_2,...,v_m)=(\lambda_1 v_1,\lambda_2 v_2,...,\lambda_m v_m)=(v_1,v_2,...,v_m) \begin{bmatrix} \lambda_1 & ... & 0 \\ \vdots & \ddots & \vdots \\ 0 & ... & \lambda_m \\ \end{bmatrix} A(v1​,v2​,...,vm​)=(λ1​v1​,λ2​v2​,...,λm​vm​)=(v1​,v2​,...,vm​)⎣⎢⎡​λ1​⋮0​...⋱...​0⋮λm​​⎦⎥⎤​ A V = V Λ (2-2) AV=V\Lambda \tag{2-2} AV=VΛ(2-2)

根据公式(2-2)就可以得到矩阵 A A A的特征分解公式:

A = V Λ V − 1 (2-3) A=V\Lambda V^{-1} \tag{2-3} A=VΛV−1(2-3)

矩阵的一组特征向量 V V V是一组正交向量。其中 V V V是这个矩阵 A A A的特征向量组成的矩阵, Λ \Lambda Λ是一个对角阵,每一个对角线上的元素就是一个特征值。

总结:特征分解,可以得到 m m m个特征向量和特征值,利用这 m m m个特征(代表这个矩阵最重要的特征),就可以近似这个矩阵。

2.1.2 特征分解的合理性

一个矩阵和该矩阵的非特征向量相乘是对该向量的旋转变换;一个矩阵和该矩阵的特征向量相乘是对该向量的伸缩变换,其中伸缩程度取决于特征值大小。

矩阵在特征向量所指的方向上具有 增强(或减弱)特征向量 的作用。这也就是说,如果矩阵持续地叠代作用于向量,那么特征向量的就会突显出来,利用python进行计算:

首先举一个例子,假设矩阵 A A A和向量 V V V: A = [ 4 1 1 1 2 1 3 2 3 ] A= \begin{bmatrix} 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end{bmatrix} A=⎣⎡​413​122​113​⎦⎤​ V = [ − 1 5 3 ] V = \begin{bmatrix} -1 \\ 5 \\ 3 \\ \end{bmatrix} V=⎣⎡​−153​⎦⎤​

用矩阵 A A A去反复左乘一个向量 V V V,python代码如下:

import numpy as np import copy A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]]) V = np.array([[-1], [5], [3]]) dot_nums = [1, 3, 5, 10] for i in range(len(dot_nums)): A_ = copy.copy(A) for _ in range(dot_nums[i] - 1): A_ = np.dot(A_, A) B = np.dot(A_, V) B = np.abs(B) C = B / np.sum(B) print("dot number: %d" % dot_nums[i]) print(C)

得到结果:

python模拟左乘

可以看到不断左乘A后,变换后的归一化向量在(0.33,0.2,0.46)附近徘徊,这与计算出来的最大特征值对应的特征向量归一化后的结果是一致的,这也就佐证了矩阵是具有某种不变的特性的。因此为了提取矩阵这种“不变性”,或者说是为了描述变换(矩阵惩罚是一种线性变换)的主要方向是非常有必要的。

2.1.3 特征分解的计算

在 (2-1) 式的基础上,进行一些变形 : A v = λ v → A v = λ I v → ( λ I − A ) v = 0 (2-4) Av=\lambda v \to Av=\lambda Iv \to (\lambda I-A)v = 0 \tag{2-4} Av=λv→Av=λIv→(λI−A)v=0(2-4) 根据线性方程组理论,为了使这个方程有非零解,矩阵 ( λ I − A ) (\lambda I-A) (λI−A)的行列式必须是零: d e t ( λ I − A ) v = 0 (2-5) det(\lambda I-A)v = 0 \tag{2-5} det(λI−A)v=0(2-5) 上式也被称为是 A A A的特征方程,计算出所有 λ \lambda λ的取值后,再代入 ( λ I − A ) v = 0 (\lambda I-A)v = 0 (λI−A)v=0求解对应的 v v v

注意:要注意特征值是重根时的情况。。。。

(1)手算

求矩阵 A A A的特征值和特征向量: ∣ λ I − A ∣ = ∣ 4 1 1 1 2 1 3 2 3 ∣ = ( λ − 6 ) ( λ − 2 ) ( λ − 1 ) |\lambda I-A| = \begin{vmatrix} 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end{vmatrix} = (\lambda-6)(\lambda-2)(\lambda-1) ∣λI−A∣=∣∣∣∣∣∣​413​122​113​∣∣∣∣∣∣​=(λ−6)(λ−2)(λ−1)

可以得到结果: λ 1 = 6 , λ 2 = 2 , λ 3 = 1 \lambda_1 = 6, \lambda_2 = 2, \lambda_3=1 λ1​=6,λ2​=2,λ3​=1

当 λ = 6 \lambda=6 λ=6时, ( 6 I − A ) v = 0 (6I-A)v=0 (6I−A)v=0: ( 4 1 1 1 2 1 3 2 3 ) ( v 1 v 2 v 3 ) = 0 \begin{pmatrix} 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end{pmatrix} \begin{pmatrix} v_1 \\ v_2 \\ v_3 \\ \end{pmatrix} = 0 ⎝⎛​413​122​113​⎠⎞​⎝⎛​v1​v2​v3​​⎠⎞​=0 r e s u l t : v 1 = 5 , v 2 = 3 , v 3 = 7 result: v_1 = 5, v_2=3, v_3=7 result:v1​=5,v2​=3,v3​=7

当 λ = 2 \lambda=2 λ=2时, ( 2 I − A ) v = 0 (2I-A)v=0 (2I−A)v=0: r e s u l t : v 1 = 1 , v 2 = − 1 , v 3 = 1 result: v_1 = 1, v_2=-1, v_3=1 result:v1​=1,v2​=−1,v3​=1

当 λ = 1 \lambda=1 λ=1时, ( I − A ) v = 0 (I-A)v=0 (I−A)v=0: r e s u l t : v 1 = 0 , v 2 = 1 , v 3 = − 1 result: v_1 = 0, v_2=1, v_3=-1 result:v1​=0,v2​=1,v3​=−1

(2)python计算

使用python中自带的库eig,其中 V V V为特征向量矩阵, D D D为特征值。 V V V中的列是对应的每一个特征向量

import numpy as np import copy A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]]) D, V = np.linalg.eig(A) if np.equal(np.dot(A, V), np.dot(V, np.diag(D))): print(True)

结果为:

python特征分解

发现python计算的和手算的特征向量值不同,但比例是一样的,这是因为特征向量不是唯一的,特征向量来自齐次线性方程组的解,是齐次线性方程组的基础解系的非零线性组合。

2.1.4 对称矩阵的特征分解(这个性质后面SVD推导用到)

定理:假设矩阵 A A A是一个对称矩阵,则其不同特征值对应的特征向量两两正交。

证明:

首先进行特征分解: A x i = λ i x i (2-6) Ax_i=\lambda_i x_i \tag{2-6} Axi​=λi​xi​(2-6) A x j = λ j x j (2-7) Ax_j=\lambda_j x_j \tag{2-7} Axj​=λj​xj​(2-7)

在公式(2-6)左乘 x j x_j xj​: x j T A x i = λ i x j T x i (2-8) x_j^\mathrm{T} Ax_i=\lambda_i x_j^\mathrm{T} x_i \tag{2-8} xjT​Axi​=λi​xjT​xi​(2-8)

因为矩阵A是一个对称矩阵,可以对式(2-8)的左边做如下变换:

x j T A x i = x j T A T x i = ( A x j ) T x i = ( λ j x j ) T x i = λ i x j T x i (2-9) x_j^\mathrm{T} Ax_i=x_j^\mathrm{T} A^\mathrm{T} x_i = (Ax_j)^\mathrm{T} x_i = (\lambda_j x_j)^\mathrm{T}x_i = \lambda_i x_j^\mathrm{T} x_i \tag{2-9} xjT​Axi​=xjT​ATxi​=(Axj​)Txi​=(λj​xj​)Txi​=λi​xjT​xi​(2-9)

最后通过(2-9)可以得到:

( λ j x j ) T x i = λ i x j T x i → ( λ j − λ i ) x j T x i = 0 (2-10) (\lambda_j x_j)^\mathrm{T}x_i = \lambda_i x_j^\mathrm{T} x_i \to (\lambda_j - \lambda_i)x_j^\mathrm{T}x_i = 0 \tag{2-10} (λj​xj​)Txi​=λi​xjT​xi​→(λj​−λi​)xjT​xi​=0(2-10) 因为 λ j ≠ λ i \lambda_j \neq \lambda_i λj​​=λi​, x j T x i x_j^\mathrm{T}x_i xjT​xi​必然等于0。 由于 x j x_j xj​和 x i x_i xi​是矩阵A的任意两个特征向量,所以命题得证。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有