当前位置:   article > 正文

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

python 矩阵 特征值分解

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)

[λ1...00...λm]
A(v1,v2,...,vm)=(λ1v1,λ2v2,...,λmvm)=(v1,v2,...,vm)λ10......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ΛV1(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=
    [411121323]
    A=413122113

    V = [ − 1 5 3 ] V =
    [153]
    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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

得到结果:

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=λvAv=λIv(λIA)v=0(2-4)
根据线性方程组理论,为了使这个方程有非零解,矩阵 ( λ I − A ) (\lambda I-A) (λIA)的行列式必须是零:
d e t ( λ I − A ) v = 0 (2-5) det(\lambda I-A)v = 0 \tag{2-5} det(λIA)v=0(2-5)
上式也被称为是 A A A的特征方程,计算出所有 λ \lambda λ的取值后,再代入 ( λ I − A ) v = 0 (\lambda I-A)v = 0 (λIA)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| =

|411121323|
= (\lambda-6)(\lambda-2)(\lambda-1) λIA=413122113=(λ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 (6IA)v=0:
( 4 1 1 1 2 1 3 2 3 ) ( v 1 v 2 v 3 ) = 0

(411121323)
(v1v2v3)
= 0 413122113v1v2v3=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 (2IA)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 (IA)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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果为:

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=λixi(2-6)
A x j = λ j x j (2-7) Ax_j=\lambda_j x_j \tag{2-7} Axj=λjxj(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} xjTAxi=λixjTxi(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} xjTAxi=xjTATxi=(Axj)Txi=(λjxj)Txi=λixjTxi(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} (λjxj)Txi=λixjTxi(λjλi)xjTxi=0(2-10)
因为 λ j ≠ λ i \lambda_j \neq \lambda_i λj=λi x j T x i x_j^\mathrm{T}x_i xjTxi必然等于0。
由于 x j x_j xj x i x_i xi是矩阵A的任意两个特征向量,所以命题得证。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/271810
推荐阅读
相关标签
  

闽ICP备14008679号