【问题标题】:Python: get unsorted list of singular values from numpy/scipy svdPython:从 numpy/scipy svd 获取未排序的奇异值列表
【发布时间】:2019-05-03 05:55:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您需要添加一些说明。奇异向量是原始特征的线性组合。奇异值量化了此新功能中保留的方差量。
  • @FChm 条件数是最大/最小奇异值的比率。所以去除一些小的奇异值可以帮助管理矩阵的条件数。

标签: python numpy scipy svd


【解决方案1】:

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

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

M = US V*

M 是您的原始矩阵。 S 是一个矩形对角矩阵,对角线上有('排序的')奇异值。 UV 分别称为左奇异向量和右奇异向量。

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

实际实施

假设您有一个 (m x q) 特征空间,由二维数组 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) 进行比较来衡量重构错误等内容,这可用于衡量缩减后的特征集中丢失的信息。

【讨论】:

    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2019-09-10
    • 2011-05-12
    • 2011-06-30
    • 2017-12-05
    • 2010-10-31
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多