2

我有一个由邻接矩阵表示的非常大的节点网络。我想减少网络中的节点数量以包含更重要的节点。我知道 SVD 可以帮助我实现这一点,我已经使用 ILNumerics 库在邻接矩阵上运行 svd() 方法。

有人可以简单地向我解释一下输出是如何帮助我减少网络维度的吗?SVD 过程给我留下了一个大小相同的矩阵,其对角线的递减值范围从 ~2 到多个 0。我如何知道要删除哪些维度被认为不重要?

我可能总体上错误地执行了此过程,因此将不胜感激任何帮助!网上的许多解释很快就会变得非常混乱。

4

1 回答 1

1

我对 ILNumerics 不太熟悉,因此我将尝试解释 SVD 在您的情况下通常能够做什么。首先,Wikipedia给出了 SVD 可能应用的一些基本信息。在您的情况下,关于“范围、零空间和秩”和“低秩矩阵近似”的部分特别感兴趣。奇异值分解可以帮助您确定真实的你的系统矩阵的等级。如果您的邻接图是稀疏的,则您的系统矩阵(例如,N 乘以 N 矩阵)的秩 M 可能小于 N。在这种情况下,您可以计算它的低秩近似。也就是说,您构建了 M 乘以 M (M < N),其中忽略了 N - M 个最小特征值,因为它们对结果的影响非常小。在这种情况下,小意味着什么当然在很大程度上取决于您的应用程序。

编辑:在您的示例数据中,您的原始矩阵 A 已分解为 A = outU svdOut outV。对角矩阵 svdOut 由 A 的特征值奇异值组成,而 outU 和 outV 的列/行分别是 A 的左奇异向量和右奇异向量。在您的示例中,奇异值为 1.61803、1.41421、0.61803 和 0(两次)。因此,原始矩阵的等级由非零奇异值的数量(在您的示例中为三个)给出。因此,您可以定义矩阵 B = outU svdOut* outV,其中星号表示已删除最不重要的奇异值。例如,您可以决定要忽略最小的特征值,因此

svdOut* =
| 1.61803  0        0  0  0 | 
| 0        1.41421  0  0  0 | 
| 0        0        0  0  0 |
| 0        0        0  0  0 |
| 0        0        0  0  0 |

但是,在再次考虑之后,我认为您的邻接矩阵的 SVD 不会直接为您提供所需的内容。您必须以某种方式定义您的上下文中的重要节点实际上是什么。

Edit2(回应下面的评论):SVD 没有给你关于你的节点的直接信息,但是关于你的矩阵。奇异向量形成一个正交基,可用于以不同形式表达原始矩阵。奇异值为您提供了有关每个向量的影响有多强的信息。同样,维基百科可能会帮助您了解如何解释这一点。回到你原来的问题,我想一个简单的 SVD 并不是你真正想要的。

于 2013-02-16T14:51:29.183 回答