什么是特征值和特征向量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是特征值和特征向量?相关的知识,希望对你有一定的参考价值。
参考技术A当A可逆时, 若 λ是A的特征值, α 是A的属于特征值λ的特征向量;则 |A| / λ 是 A*的特征值, α 仍是A*的属于特征值 |A| / λ 的特征向量。
设A是n阶方阵,如果数λ和n维非零列向量x使关系式Ax=λx成立,那么这样的数λ称为矩阵A特征值,非零向量x称为A的对应于特征值λ的特征向量。
式Ax=λx也可写成( A-λE)X=0。这是n个未知数n个方程的齐次线性方程组,它有非零解的充分必要条件是系数行列式| A-λE|=0。
设A是数域P上的一个n阶矩阵,λ是一个未知量,
称为A的特征多项式,记¦(λ)=|λE-A|,是一个P上的关于λ的n次多项式,E是单位矩阵。
¦(λ)=|λE-A|=λ+a1λ+…+an= 0是一个n次代数方程,称为A的特征方程。特征方程¦(λ)=|λE-A|=0的根(如:λ0)称为A的特征根(或特征值)。n次代数方程在复数域内有且仅有n个根,而在实数域内不一定有根,因此特征根的多少和有无,不仅与A有关,与数域P也有关。
以A的特征值λ0代入(λE-A)X=θ,得方程组(λ0E-A)X=θ,是一个齐次方程组,称为A的关于λ0的特征方程组。因为|λ0E-A|=0,(λ0E-A)X=θ必存在非零解 , 称为A的属于λ0的特征向量。所有λ0的特征向量全体构成了λ0的特征向量空间。
扩展资料:
性质1:n阶方阵A=(aij)的所有特征根为λ1,λ2,…,λn(包括重根),则:
性质2:若λ是可逆阵A的一个特征根,x为对应的特征向量,则1/λ 是A的逆的一个特征根,x仍为对应的特征向量。
性质3:若 λ是方阵A的一个特征根,x为对应的特征向量,则λ 的m次方是A的m次方的一个特征根,x仍为对应的特征向量。
性质4:设λ1,λ2,…,λm是方阵A的互不相同的特征值。xj是属于λi的特征向量( i=1,2,…,m),则x1,x2,…,xm线性无关,即不相同特征值的特征向量线性无关。
如将特征值的取值扩展到复数领域,则一个广义特征值有如下形式:Aν=λBν
其中A和B为矩阵。其广义特征值(第二种意义)λ 可以通过求解方程(A-λB)ν=0,得到det(A-λB)=0(其中det即行列式)构成形如A-λB的矩阵的集合。其中特征值中存在的复数项,称为一个“丛(pencil)”。
若B可逆,则原关系式可以写作 ,也即标准的特征值问题。当B为非可逆矩阵(无法进行逆变换)时,广义特征值问题应该以其原始表述来求解。
如果A和B是实对称矩阵,则特征值为实数。这在上面的第二种等价关系式表述中并不明显,因为 A矩阵未必是对称的。
参考资料:百度百科——矩阵特征值
C++ 中的最大特征值(和相应的特征向量)
【中文标题】C++ 中的最大特征值(和相应的特征向量)【英文标题】:Largest eigenvalues (and corresponding eigenvectors) in C++ 【发布时间】:2014-06-28 15:57:14 【问题描述】:在 C++ 中为大型密集矩阵计算 k 个最大特征值和特征向量的最简单和最快的方法是什么(当然是使用一些库)?我正在寻找相当于 MATLAB 的 eigs
函数;我已经查看了 Armadillo 和 Eigen,但找不到一个,并且在我的情况下计算所有特征值需要很长时间(对于大约 30000x30000 密集的非对称实矩阵,我需要前 10 个特征向量)。
绝望,我什至尝试用犰狳的 QR 分解自己实现幂迭代,但遇到了复杂的特征值对并放弃了。 :)
【问题讨论】:
【参考方案1】:你试过https://github.com/yixuan/spectra 吗? 它类似于 ARPACK,但具有很好的类似 Eigen 的界面(它与 Eigen 兼容!)
我将它用于 30kx30k 矩阵 (PCA),效果还不错
【讨论】:
我自己在我的应用程序中尝试过这个,它使用 Eigen 处理所有与线性代数相关的事情,这非常方便:只有标题(如 Eigen)所以没有构建问题,只需 #include + 4 行代码和我有我的特征值、特征值格式的输入和输出,并且比我自己实现的 Lanczos 迭代快得多,在几秒钟内在 80k x 80k 稀疏矩阵中获得 100 个特征值(最高或最小)。【参考方案2】:AFAIK 找到 generic 矩阵的第一个 k
特征值的问题没有简单的解决方案。您提到的 Matlab 函数 eigs
应该适用于稀疏矩阵。
Matlab 可能使用 Arnoldi/Lanczos,即使您的矩阵不是稀疏的,您也可以尝试它是否适合您的情况。 Arnlodi 的参考包是ARPACK,它有一个 C++ 接口。
【讨论】:
我不确定它使用哪种算法,但 Matlab 的eigs
确实比查找大型密集矩阵的所有特征值快得多。
eigs
使用 Arnoldi,旨在输出第一个较大的 k
特征值。比查找所有特征值快还是慢取决于您的k
有多大。
谢谢! Arpack 没有世界上最友好的界面,但它确实有效。 4 分 20 秒解决我的问题(大小为 30K x 30K 的矩阵的 10 个特征向量)非常好。【参考方案3】:
Eigen 有一个运行良好的 EigenValues 模块。但是,我从来没有在这么大的东西上使用过它。
【讨论】:
是的,但我在那里找不到任何计算最高k
特征值的东西。查找所有特征值会很慢。
我看到了一些示例函数here 计算主要特征值/向量。【参考方案4】:
这是我如何在C++ Eigen 中获得 NxN 实值(浮点)、密集、对称矩阵 A 的 k 个最大特征向量:
#include <Eigen/Dense>
...
Eigen::MatrixXf A(N,N);
...
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> solver(N);
solver.compute(A);
Eigen::VectorXf lambda = solver.eigenvalues().reverse();
Eigen::MatrixXf X = solver.eigenvectors().block(0,N-k,N,k).rowwise().reverse();
请注意,特征值和相关的特征向量按升序返回,因此我将它们反转以首先获得最大值。
如果您想要其他(非对称)矩阵的特征值和特征向量,它们通常会很复杂,您需要改用 Eigen::EigenSolver
类。
【讨论】:
以上是关于什么是特征值和特征向量?的主要内容,如果未能解决你的问题,请参考以下文章