讲一下numpy的矩阵特征值分解

主要还是调包:

from numpy.linalg import eig

特征值分解:  A = P*B*PT  当然也可以写成 A = PT*B*P  其中B为对角元为A的特征值的对角矩阵。

首先A得正定,然后才能在实数域上分解,

>>> A = np.random.randint(-10,10,(4,4))
>>> A
array([[  6,   9, -10,  -1],
       [  5,   9,   5,  -5],
       [ -8,   7,  -4,   4],
       [ -1,  -9,   0,   6]])

>>> C = np.dot(A.T, A)
>>> C
array([[126,  52,  -3, -69],
       [ 52, 292, -73, -80],
       [ -3, -73, 141, -31],
       [-69, -80, -31,  78]])

>>> vals, vecs = eig(C)
>>> vals
array([357.33597086, 174.10172008,   8.84429957,  96.71800949])
>>> vecs
array([[-0.28738314, -0.51589436, -0.38221983, -0.71075449],
       [-0.87487263,  0.12873861, -0.24968051,  0.39456798],
       [ 0.2572149 , -0.69304313, -0.33950158,  0.58161018],
       [ 0.29300052,  0.48679627, -0.82237845, -0.02955945]])

故使用时应先将特征值转换为矩阵:

>>> Lambda = np.diag(vals)
>>> Lambda
array([[357.33597086,   0.        ,   0.        ,   0.        ],
       [  0.        , 174.10172008,   0.        ,   0.        ],
       [  0.        ,   0.        ,   8.84429957,   0.        ],
       [  0.        ,   0.        ,   0.        ,  96.71800949]])

>>> np.dot(np.dot(vecs, Lambda), vecs.T) # 与C=A.T*A相等
array([[126.,  52.,  -3., -69.],
       [ 52., 292., -73., -80.],
       [ -3., -73., 141., -31.],
       [-69., -80., -31.,  78.]])

>>> np.dot(np.dot(vecs.T, Lambda), vecs)
array([[171.65817919,  45.58778569,  53.20435074,  13.37512137],
       [ 45.58778569, 125.15670964,  28.22684299, 134.91290105],
       [ 53.20435074,  28.22684299, 129.48789571,  80.5284382 ],
       [ 13.37512137, 134.91290105,  80.5284382 , 210.69721545]])

故验证了使用np中的eig分解为A=P*B*PT 而不是A=PT*B*P,其中P=vecs,

即 C = vecs * np.diag(vals) * vecs.T # 这里简写*为矩阵乘法

然后再来看使用np中的eig分解出来的vec中行向量是特征向量还是列向量是特征向量,只需验证:A*vecs[0] = vals[0]*vecs[0]

>>> np.dot(C, vecs[0])
array([-12.84806258, -80.82266859,   6.66283128,  17.51094927])
>>> vals[0]*vecs[0]
array([-102.69233303, -184.34761071, -136.58089252, -253.97814676])

>>> np.dot(C, vecs[:,0])
array([-102.69233303, -312.62346098,   91.91213634,  104.69962583])
>>> vals[0]*vecs[:, 0]
array([-102.69233303, -312.62346098,   91.91213634,  104.69962583])

后者两个是相等的,故使用np中的eig分解出的vecs的列向量是特征向量。

然后我们可以验证P是单位正交矩阵:

>>> np.dot(vecs.T, vecs)
array([[ 1.00000000e+00, -7.13175042e-17, -2.45525952e-18,
         2.75965773e-16],
       [-7.13175042e-17,  1.00000000e+00,  2.49530948e-17,
        -5.58839097e-16],
       [-2.45525952e-18,  2.49530948e-17,  1.00000000e+00,
        -7.85564967e-17],
       [ 2.75965773e-16, -5.58839097e-16, -7.85564967e-17,
         1.00000000e+00]])

>>> np.dot(vecs, vecs.T)
array([[ 1.00000000e+00,  2.97888865e-16, -2.68317972e-16,
         1.69020590e-16],
       [ 2.97888865e-16,  1.00000000e+00, -4.40952204e-18,
        -6.24188690e-17],
       [-2.68317972e-16, -4.40952204e-18,  1.00000000e+00,
        -1.13726775e-17],
       [ 1.69020590e-16, -6.24188690e-17, -1.13726775e-17,
         1.00000000e+00]])

# 可以看到除对角元外其他都是非常小的数

即PT*P = P*PT = E , PT=P-1。事实上,在求解P的过程中就使用了施密特正交化过程。

另一方面,我们从数学角度来看:

首先补充一些数学知识:

首先AB相似:P-1*A*P=B,AB合同:CT*A*C=B,

二次型:系数在K中的一个n元二次多项式。由其生成的矩阵称为二次型的矩阵,二次型的矩阵一定是对称矩阵!

正定矩阵:实二次型xT*A*x > 0, x为列向量。

性质:假设A为正定矩阵

1、正定矩阵特征值全大于0

2、行列式 |A| >0

3、A合同于单位阵E,即存在可逆方阵C, s.t. CT*E*C = A = CT*C, 显然可得A为对称正定

正交矩阵:A*AT=AT*A=E ,

性质:

1、A的各行/列是单位向量且两两正交

2、AT=A-1

3、|A|=1

4、(Ax,Ay)=(x,y)x,y∈R

酉矩阵:A*AH=AH*A=E 显然为正交矩阵在复数域上的推广。其中H为共轭转置。

性质:

1、A的各行/列是单位向量且两两正交

2、AH=A-1

3、|A|=1

(这里补充一个厄米特矩阵:AH = A)

正规矩阵:A*AH=AH*A (以上的矩阵均有这个性质,故正规矩阵最为广泛)

正规矩阵的充要条件是:存在酉矩阵U,使得A酉相似于对角矩阵B,即UH*A*U=U-1*A*U=B。

A = P*B*P  ,其中B为对角元素为A的特征值的对角阵,P的列向量为特征值对应的特征向量(因为B每行乘以P每列)

原文地址:https://www.cnblogs.com/cymwill/p/9937850.html

时间: 2024-10-09 00:19:45

讲一下numpy的矩阵特征值分解的相关文章

机器学习基础篇——矩阵特征值分解含义解析及应用

特征值与特征向量的几何意义: 矩阵的乘法是什么,别只告诉我只是"前一个矩阵的行乘以后一个矩阵的列",还会一点的可能还会说"前一个矩阵的列数等于后一个矩阵的行数才能相乘",然而,这里却会和你说--那都是表象. 矩阵乘法真正的含义是变换,我们学<线性代数>一开始就学行变换列变换,矩阵乘法就是线性变换,若以其中一个向量A为中心,则B的作用主要是使A发生如下变化: 伸缩 clf;     %用来清除图形的命令 A = [0, 1, 1, 0, 0;... 1, 

矩阵特征值分解与奇异值分解含义解析及应用

此文有一半转载自他出,主要在这进行个整理,具体内容文中都有相关的转载链接. 特征值与特征向量的几何意义 矩阵的乘法是什么,别只告诉我只是"前一个矩阵的行乘以后一个矩阵的列",还会一点的可能还会说"前一个矩阵的列数等于后一个矩阵的行数才能相乘",然而,这里却会和你说--那都是表象. 矩阵乘法真正的含义是变换,我们学<线性代数>一开始就学行变换列变换,那才是线代的核心--别会了点猫腻就忘了本--对,矩阵乘法 就是线性变换,若以其中一个向量A为中心,则B的作用

矩阵的“特征值分解”和“奇异值分解”区别

在信号处理中经常碰到观测值的自相关矩阵,从物理意义上说,如果该观测值是由几个(如 K 个)相互统计独立的源信号线性混合而成,则该相关矩阵的秩或称维数就为 K,由这 K 个统计独立信号构成 K 维的线性空间,可由自相关矩阵最大 K 个特征值所对应的特征向量或观测值矩阵最大 K 个奇异值所对应的左奇异向量展成的子空间表示,通常称信号子空间,它的补空间称噪声子空间,两类子空间相互正交.理论上,由于噪声的存在,自相关矩阵是正定的,但实际应用时,由于样本数量有限,可能发生奇异,矩阵条件数无穷大,造成数值不

矩阵的特征值分解

引入问题:给定一个对角线非零的上三角矩阵\(M\),求\(M^k\),满足\(M\)的阶\(\le 500\),\(k\le 10^9\). 对998244353取模. 一个显而易见的算法是矩阵快速幂,然而是\(O(N^3\log k)\)的,无法通过本题. 一开始我想,既然是上三角矩阵,那么特征多项式一定不难求,那么是用CH定理+FFT多项式取模啥搞搞? 然而我naive了. 这题我们可以把\(M\)特征值分解为\(Q^{-1}AQ\)形式,其中\(A\)是一个对角矩阵. 那么\(M^k=(Q

特征值分解和奇异值分解

特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性.就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生

矩阵特征值与行列式、迹的关系

矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下: 1.二次方程的韦达定理: 请思考:x^2+bx+c=0 这个方程的所有根的和等于多少.所有根的积等于多少 2.把二次方程推广到 N 次: 对一个一元n次方程,它的根记作 那么接下来可以类似地来思考:(x-x1)(x-x2)(x-x3)...(x-n_N)=0 这个方程的所有根的和对应于等式左边展开后几次项的系数,所有根的积对应等式展开后几次项的系数. 说明: 已知一个一元五次方程: 根据高斯的代数原理:上式在复

特征值分解,奇异值分解(SVD)

特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征. 1. 特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 写成矩阵形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量. 2. 特征分解: 特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,正交矩阵是可逆的.Σ?=?diag(λ1,?λ2,

特征值分解和SVD

特征值分解 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量.特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值.我这里引用了一些参考文献中的内容来说明一下.首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换.比如说下面的一个矩阵: 它其实对应的线性变

lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法

本文属作者原创,转载请注明出处 http://www.cnblogs.com/qxred/p/dcalgorithm.html 本系列目录: lanczos算法及C++实现(一)框架及简单实现 lanczos算法及C++实现(二)实对称阵奇异值分解的QR算法 lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法 0. 参考文献 https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm A. Mel