机器学习-统计与数学

【矩阵】一篇入门之-矩阵的对角化是什么

作者 : 老饼 发表日期 : 2022-11-02 19:42:13 更新日期 : 2025-06-25 00:22:54
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



矩阵的对角化,是指通过一个可逆P,将方阵A进行对角化,以简化矩阵对应的变换

本文讲解矩阵对角化的定义、本质与目的,并展示对角化的具体流程和代码实现

通过本文,可以了解什么是矩阵的对角化,对角化是为了什么,以及如何将矩阵对角化





   01. 什么是矩阵的对角化    




本节讲解什么是矩阵的对角化,包括它的定义与本质





    矩阵对角化的定义     


矩阵的对角化是指:
对于矩阵A,求一个可逆P,使得P1AP\small P^{-1}AP是一个对角矩阵
 数学表述如下:
 P1AP=ΛP^{-1}AP=\Lambda
   其中,Λ\Lambda是一个对角矩阵
一般地,把 PP的各列称为A的特征向量
 Λ\Lambda对角上的元素λ\lambda称为矩阵A的特征值
 备注:矩阵的对角化只相对方阵而言,且,不是所有方阵都能对角化






     如何理解矩阵对角化     


矩阵与线性变换
 
不太严谨地说,变换就是把空间的一个向量,线性映射到该空间的另一个向量之中
线性变换可以使用矩阵来描述,对应地,每个矩阵,背后都指代着一个线性变换
 如下所示,矩阵A所代表的变换σ\sigma,将向量(1,0)变换到了(1.5,0)中
 
因此每个矩阵A,都可以当作某个变换σ\sigma的数学描述
 备注:矩阵A并不完全等价于变换σ\sigma,因为σ\sigma是绝对的,而A只是它的其中一种表述
如何理解矩阵的对角化
P1AP=ΛP^{-1}AP=\Lambda可得:
 AP=PΛAP=P\Lambda
即对于P的每一列PiP_i都有:
 APi=λiPiAP_i=\lambda_i P_i 
即P的每一列在矩阵A指代的线性变换σ\sigma下,都保持方向不变,只是长度进行了λi\lambda_i的伸缩
 
所以矩阵的对角化,实际就是找出n个向量,这n个向量在A的变换σ\sigma下只进行伸缩
这n个在变换A下不变的向量,称为A的特征向量,它们的伸缩倍数λ\lambda则称为A的特征值








    02. 矩阵对角化的基本目的    




本节讲解矩阵对角化的基本目的,从而知道为什么要将矩阵对角化





      矩阵对角化的基本目的     


矩阵对角化的最基本目的是为了揭示矩阵A所对应的变换是个什么东西
由于A特征向量(即P)在变换A下只进行简单的伸缩
因此,如果把特征向量(即P)作为基,则可以简化变换
 对于任意向量q,记它在基P下的坐标为xx',则:
 q=x1P1+x2P2+...+xnPnq =x'_1P_1+x'_2P_2+...+x'_nP_n
由于每个PiP_i在A所指代的线性变换σ\sigma下只进行简单的伸缩
因此有:

 σ(q)=σ(x1P1+x2P2+...+xnPn)=σ(x1P1)+σ(x2P2)+...+σ(xnPn)=x1σ(P1)+x2σ(P2)+...+xnσ(Pn)=x1λ1P1+x2λ2P2+...+xnλnPn\begin{aligned} \sigma(q) &=\sigma(x'_1P_1+x'_2P_2+...+x'_nP_n) \\ &=\sigma(x'_1P_1)+\sigma(x'_2P_2)+...+\sigma(x'_nP_n) \\ &=x'_1\sigma(P_1)+x'_2\sigma(P_2)+...+x'_n\sigma(P_n) \\ &=x'_1\lambda_1P_1+x'_2\lambda_2P_2+...+x'_n\lambda_nP_n \end{aligned}
 可得,σ(q)\sigma(q)的坐标为[x1λ1,x2λ2,...,xnλn]=Λx[x_1'\lambda_1,x_2'\lambda_2,...,x_n'\lambda_n]=\Lambda x'
因此,站在基P的角度来看,变换σ\sigma就是将xx'变换为Λx\Lambda x'
即,站在基P的角度来看,
A所指代的变换σ\sigma表示为Λ\Lambda,它仅仅是将第i维进行λi\lambda_i的伸缩
 因此,矩阵A对角化的意义就是,找出一个基P,使得在基P的视角下,变换A是一个对角变换Λ\Lambda
即矩阵对角化,可以换一个视角来简化变换A,从而更简单地、更本质地来研究、使用A






      矩阵对角化的基本目的-举例      


下面通过一个例子,展示矩阵对角化,是如何清晰的抓住矩阵对应的线性变换的特性的
设 A=[1.50.50.51.5]A= \begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix}
 将A进行对角化,可得:
 A=PΛP1=[0.7070.7070.7070.707][2001][0.7070.7070.7070.707]1\small A=P\Lambda P^{-1}=\begin{bmatrix} 0.707 & -0.707\\ 0.707 &0.707 \end{bmatrix}* \begin{bmatrix} 2 & 0\\ 0 &1 \end{bmatrix}*\begin{bmatrix} 0.707 & -0.707\\ 0.707 &0.707 \end{bmatrix}^{-1}
 未对角化前对线性变换的认识
以向量q = [1,0]为例,如果直接看A,
那么只知道它所指代的变换σ\sigma,会将q变换到σ(q)=A[0,1]=[1.5,0.5]\sigma(q) = A*[0,1]=[1.5,0.5],如下
  
光是这样看,是很难了解A所指代的变换σ\sigma的特性的,只知道它把(1,0)变换到了(1.5,0.5)
 对角化后对线性变换的认识
通过对角化后,可得到P=[0.7070.7070.7070.707]\small P=\begin{bmatrix} 0.707 & -0.707\\ 0.707 &0.707 \end{bmatrix},以P为基,则有:
  
以P为基,变换σ\sigma其实就是将q点的P1、P2方向伸缩2、1倍
因此,变换σ\sigma在原来坐标系的表示为A,很难理解σ\sigma是个什么样的变换
而用P作为基,则σ\sigma就只是在各个坐标轴中进行伸缩的变换,一下子就简单得多了~
 一个矩阵如果可以对角化,则说明它背后所指的变换实质是某组基下的伸缩变换
而变换总是各种各样的,并不永远都是伸缩变换,所以不会所有的矩阵都能对角化







    03.矩阵对角化的方法     




本节展示如何对矩阵进行对角化,以及代码实现方法





       矩阵对角化的理论方法     


矩阵对角化的思路
由于对于每个特征向量x\textbf{x}有:
 Ax=λxA\textbf{x}=\lambda \textbf{x}            
因此有:
 Axλx=0A\textbf{x}-\lambda \textbf{x}=\textbf{0}   
即:
 (AλI)x=0(A-\lambda I)\textbf{x} = \textbf{0}
上式说明AλIA-\lambda I线性相关,因此:
 AλI=0|A-\lambda I|=0 
AλI|A-\lambda I|展开后是一个关于λ\lambda的n次多项式,即
                AλI=fn(λ)=0|A-\lambda I|=f^{n}(\lambda)=0
求解多项式fn(λ)=0f^{n}(\lambda)=0求得多个λ\lambda
将各个特征值λ\lambda代入(AλI)x=0(A-\lambda I)\textbf{x} = \textbf{0},就可以解得对应的特征向量x\textbf{x}
矩阵对角化-例子解说
以 A=[1.50.50.51.5]\small A= \begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix}为例,将它对角化的实操过程如下:
1. 计算特征多项式                                                                     
       f(λ)=AλI=[1.50.50.51.5]λI=1.5λ0.50.51.5λ=(1.5λ)(1.5λ)0.50.5=1.52+λ23λ0.25=λ23λ+2\small \begin{aligned} f(\lambda) = |A-\lambda I| &= \left|\begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix}-\lambda I \right| \\&= \begin{vmatrix} 1.5-\lambda & 0.5\\ 0.5 &1.5-\lambda \end{vmatrix} \\&=(1.5-\lambda )*(1.5-\lambda )-0.5*0.5 \\&=1.5^2+\lambda^2-3\lambda-0.25 \\&=\lambda^2-3\lambda+2 \end{aligned}     
2. 求解特征值                                                                           
  由f(λ)=λ23λ+1\small f(\lambda) =\lambda^2-3\lambda+1解得: λ1=2,λ2=1\small \lambda_1 = 2,\lambda_2=1             

3. 求解特征向量                                                                        
(1) 将λ1=2\lambda_1=2代入 (AλI)x=0\small (A-\lambda I)\textbf{x} = \textbf{0},可得:                       
                             (Aλ1I)x=([1.50.50.51.5][2002])x=[0.50.50.50.5]x=0\small \left ( A-\lambda_1I \right )\textbf{x} = \left ( \begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix}-\begin{bmatrix} 2 & 0\\ 0 &2 \end{bmatrix} \right ) \textbf{x}= \begin{bmatrix} -0.5 & 0.5\\ 0.5 &-0.5 \end{bmatrix}\textbf{x} = \textbf{0} 

     解得特征向量x=[11]\small \textbf{x}= \begin{bmatrix} 1\\ 1 \end{bmatrix}                                       

(2) 将λ2=1\small \lambda_2=1代入 (AλI)x=0\small (A-\lambda I)\textbf{x} = \textbf{0},可得:                        
                            (Aλ2I)x=([1.50.50.51.5][1001])x=[0.50.50.50.5]x=0\small \left ( A-\lambda_2I \right )\textbf{x} = \left ( \begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix}-\begin{bmatrix} 1 & 0\\ 0 &1 \end{bmatrix} \right ) \textbf{x}= \begin{bmatrix} 0.5 & 0.5\\ 0.5 &0.5 \end{bmatrix}\textbf{x} = \textbf{0}    
 
 解得特征向量x=[11]\small \textbf{x}= \begin{bmatrix} -1\\ 1 \end{bmatrix}                                       
4. 组装与单位化P                                                                      
 将两个特征向量按列组装,可得到 P=[1111]\small P= \begin{bmatrix} 1&-1\\ 1&1 \end{bmatrix}        
进一步将它按列单位化后得到:                        

 P=[0.70710.70710.70710.7071]\small P= \begin{bmatrix} 0.7071& -0.7071\\ 0.7071& 0.7071 \end{bmatrix}              
5. 验证                                                                                      
 可进一步验证:                                        
                                P1AP=[0.70710.70710.70710.7071]1[1.50.50.51.5][0.70710.70710.70710.7071]=[2001]\small P^{-1}AP= \begin{bmatrix} 0.7071&- 0.7071\\ 0.7071& 0.7071 \end{bmatrix}^{-1} \begin{bmatrix} 1.5 & 0.5\\ 0.5 &1.5 \end{bmatrix} \begin{bmatrix} 0.7071& -0.7071\\ - 0.7071& 0.7071 \end{bmatrix} = \begin{bmatrix} 2& 0\\ 0& 1 \end{bmatrix}





      矩阵对角化-代码实现    


在python中可以使用numpy来实现矩阵的对角化
 具体代码示例如下:
import numpy as np
A   = np.array([[1.5,0.5],[0.5,1.5]])  # 准备进行对角化的矩阵A
d,P = np.linalg.eig(A)                 # 计算特征值和特征向量
L   = np.linalg.inv(P) @ A @ P         # 对角化A
print("\n原始矩阵A:\n",A)              # 打印原始矩阵A
print("\n特征向量矩阵P:\n",P)          # 打印特征向量矩阵P
print("\n对角化后的特征值L:\n",L)      # 打印对角化后的特征值L
 代码运行结果如下:
  
可以看到,使用矩阵P对A进行对角化后,得到了对角矩阵L







好了,以上就是矩阵的对角化,以及它的意义和对角化流程了~


















图标 评论
添加评论