Python:从numpy/scipy svd获取未排序的奇异值列表
我有一个方形矩阵,希望使用svd通过消除一些行/列来减少矩阵的条件数 我使用numpy/scipy都给出了单数值的排序列表 使用排序列表,通过丢弃一些小的奇异值,我可以轻松地重建较小的矩阵。但很难映射到原始矩阵,即哪些值被消除,哪些值被保留。我需要更进一步Python:从numpy/scipy svd获取未排序的奇异值列表,python,numpy,scipy,svd,Python,Numpy,Scipy,Svd,我有一个方形矩阵,希望使用svd通过消除一些行/列来减少矩阵的条件数 我使用numpy/scipy都给出了单数值的排序列表 使用排序列表,通过丢弃一些小的奇异值,我可以轻松地重建较小的矩阵。但很难映射到原始矩阵,即哪些值被消除,哪些值被保留。我需要更进一步 有没有办法在以后确定原始矩阵、保留了哪些索引以及丢弃了哪些索引。要对矩阵执行奇异值分解,您可以查看numpy中的模块 矩阵的奇异值分解将其分解为三个矩阵的乘积: M=U S V* M是您的原始矩阵S是一个矩形对角矩阵,对角线上有('sorte
有没有办法在以后确定原始矩阵、保留了哪些索引以及丢弃了哪些索引。要对矩阵执行奇异值分解,您可以查看numpy中的模块 矩阵的奇异值分解将其分解为三个矩阵的乘积: M=U S V* M是您的原始矩阵S是一个矩形对角矩阵,对角线上有('sorted')奇异值U和V分别称为左奇异向量和右奇异向量 注意:np.linalg.svd不返回S,而是返回S,它只是一个包含奇异值的一维数组 实际实施 假设有一个由2D数组
x
表示的(mxq)特征空间,其中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
)进行比较来测量缩减功能集中丢失的信息,以测量重建错误等情况 您需要添加一些说明。奇异向量是原始特征的线性组合。奇异值量化此新功能中保留的方差量。@FChm条件数是最大/最小奇异值的比率。因此,去除一些小的奇异值可以帮助管理矩阵的条件数。