我有一个方矩阵,想使用svd通过消除一些行/列来减少矩阵的条件数。
我用numpy / scipy都给出了奇异值的排序列表。
使用排序列表,我可以通过丢弃一些小的奇异值轻松地重建一个较小的矩阵。但是很难映射到原始矩阵,即消除了哪些值,并保留了哪些值。我需要进一步。
以后有什么方法可以识别原始矩阵,保留哪些索引以及丢弃哪些索引。
答案 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
)进行比较以测量诸如重构错误之类的内容,这可以用于度量精简功能集中丢失的信息。