Python:从numpy / scipy svd获取未排序的奇异值列表

时间:2019-05-03 05:55:26

标签: python numpy scipy svd

我有一个方矩阵,想使用svd通过消除一些行/列来减少矩阵的条件数。

我用numpy / scipy都给出了奇异值的排序列表。

使用排序列表,我可以通过丢弃一些小的奇异值轻松地重建一个较小的矩阵。但是很难映射到原始矩阵,即消除了哪些值,并保留了哪些值。我需要进一步。

以后有什么方法可以识别原始矩阵,保留哪些索引以及丢弃哪些索引。

1 个答案:

答案 0 :(得分:0)

要对矩阵执行奇异值分解,可以查看numpy中的.linalg`模块。

矩阵的SVD将其分解为三个矩阵的乘积:

M = U S V *

M 是您的原始矩阵。 S 是一个矩形对角矩阵,对角线上带有(“已排序”)奇异值。 U V 分别称为左奇异矢量和右奇异矢量。

注意:np.linalg.svd不返回 S ,而是返回 s ,它只是包含奇异值的一维数组。

实际实施

假设您有一个(m x q)特征空间,该特征空间由2D数组X表示,其中X是居中的矩阵。您可以计算其SVD:

U, s, Vt = np.linalg.svd(X)

其中t表示V的转置,而s是您的“未排序的奇异值列表”。

然后,您可以使用奇异向量并丢弃保留最小方差的奇异向量,将原始特征空间投影到n维度:

X_projected = X.dot(Vt.T[:,:n])

其中X_projected现在是较低n维空间中要素空间的表示。

重要的是,您可以将缩小的特征空间转换回原始空间:

X_recovered = X_projected.dot(Vt[:,:n])

值得注意的是,通过将X_recovered与原始功能集(X)进行比较以测量诸如重构错误之类的内容,这可以用于度量精简功能集中丢失的信息。