【问题标题】:Computing Low-Rank approximation in Python在 Python 中计算低秩近似
【发布时间】:2018-02-16 13:26:42
【问题描述】:

给定一个维度为 nxn 的矩阵 M,我如何计算一个低秩分解,使得 M = L.T * L,其中 L 的维度为 kxn。到目前为止,我只看到使用 SVD 完成此操作,这并不是我想要的,因为该方法给了我 M = USV 和 UT != S*V,而不是 ( LT).T == L.

另一种选择可能是使用某种形式的优化来找到 L,但这并不简单,因为我已经尝试了几种 SciPy 的优化方法,在 frobenius 范数下具有 M - LT * L 的差异,到目前为止我没有成功。

编辑:我忘了补充一点,通过使用 scikit 的非负矩阵分解类,我可以通过传递 L 和 L.T 作为优化的候选矩阵来部分实现这一点。但是,我的矩阵 M 不是非负数,因此这种方法对我不起作用。

【问题讨论】:

  • 你说“什么是最好的方法……”但是你说的最好是什么意思?你的意思是最快的执行?最低的复杂性?最容易阅读和理解?最容易编码? -- 你还说“我试过'x',但这不是我想要的”它有什么问题?你想要什么?似乎 SVD 是找到分解的好方法。
  • 感谢您的评论,我改进了问题以解决您的建议。
  • 这个问题似乎更适合math.stackexchange。我不会投票结束,因为这个问题是关于算法的,它在网站的条款范围内。但是,您在这里可能得不到好的答案。
  • 我觉得更适合scicomp

标签: python optimization scipy scikit-learn matrix-factorization


【解决方案1】:

答案取决于您对矩阵的了解。

如果矩阵是半正定矩阵,可以使用Cholesky Factorization, 使用旋转以获得稳定性。

在其他假设下,可能不存在解决方案。


一个可能不存在解的例子,下面的矩阵没有解:

[[0, 1],
 [0, 0]] 

证明:假设答案存在。那么解决方案如下:

L = [[a, b],
     [c, d]]

所以以下必须为真:

  1. a*a + b*c == 0
  2. d*d + b*c == 0
  3. c * (a+d) == 0
  4. b * (a+d) == 1

根据3.(c == 0) or ((a+d) == 0)

如果c == 0,则根据1.和2.a == 0d == 0。如果这是真的,那么 (a+d) == 0 这使得 4. 不可能。

如果(a+d) == 0 则 4. 是不可能的。

通过矛盾,我们知道你要求的这个矩阵不能分解。

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2020-05-11
    • 2012-02-28
    • 2010-11-05
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2011-03-05
    相关资源
    最近更新 更多