You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何求取大规模矩阵对应的前两大特征向量

非方阵场景下求取前两大特征/奇异向量的方案

首先要注意,你提到的100*200的矩阵属于非方阵,本身不存在常规意义上的特征值与特征向量,通常这种场景下大家需求的是其对应协方差方阵的特征向量,或是矩阵的奇异向量,可以按下面的方法高效实现,不需要全量计算所有特征值:

方案1:直接求取对应方阵的前两大特征向量

如果你的需求是计算矩阵A对应的A@A.T(100100方阵)或A.T@A(200200方阵)的前两大特征向量,可以用scipy的eigsh接口,它支持仅计算指定数量的最大/最小特征值,效率远高于全量计算的numpy.linalg.eig:

import numpy as np
from scipy.sparse.linalg import eigsh

# 示例100*200矩阵
A = np.random.rand(100, 200)
# k=2指定只返回前2大特征值与对应向量,which='LM'表示取模最大的结果
eigenvalues, eigenvectors = eigsh(A @ A.T, k=2, which='LM')

返回的eigenvectors里每一列就是对应的特征向量,默认按特征值从小到大排列,取最后两列就是前两大的特征向量。

方案2:求取前两大奇异向量(最常用)

如果你的需求是非方阵场景下的类特征向量计算,直接用奇异值分解更方便,同样可以用scipy的svds接口仅计算前k个最大奇异值对应的向量:

from scipy.sparse.linalg import svds

# k=2指定取前2个最大奇异值对应的结果
left_singular_vectors, singular_values, right_singular_vectors = svds(A, k=2, which='LM')

返回的左奇异向量就是A@A.T的特征向量,右奇异向量的转置就是A.T@A的特征向量,和方案1的结果完全对应。

性能说明

上述两个接口都是针对部分特征/奇异值计算场景做过优化的,相比numpy.linalg.eig全量计算所有特征的方案,在矩阵规模更大的时候,速度和内存占用优势会更明显。

内容的提问来源于stack exchange,提问作者Hermi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:30:01