什么是特征值和特征向量?

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 类。

【讨论】:

以上是关于什么是特征值和特征向量?的主要内容,如果未能解决你的问题,请参考以下文章

qr分解怎么求特征向量,求矩阵E的特征值和特征向量

向量的几何意义是啥

主成分分析法中特征向量有啥意思 ,能用来评估对应变量的权值吗

如何用MATLAB将特征向量标准化

Matlab 矩阵特征值排序问题

特征向量怎么求