我有一个由邻接矩阵表示的非常大的节点网络。我想减少网络中的节点数量,以包含更重要的节点。我知道SVD可以帮助我实现这一点,我已经使用ILNumerics库在邻接矩阵上运行svd()方法。
有人可以向我简单解释输出是如何帮助我减少网络规模的吗? SVD过程给我留下了一个相同大小的矩阵,对角线的下降值范围从~2到0。我怎么知道哪些尺寸被认为不重要?
我可能整体上做错了这个过程,所以任何帮助都将非常感谢!许多在线解释很快就会让人感到困惑。
答案 0 :(得分:1)
我对ILNumerics并不太熟悉,所以我会尝试解释一般情况下SVD能够解决的问题。首先,Wikipedia给出了SVD可能应用的一些基本信息。在您的情况下,关于“范围,零空间和等级”和“低秩矩阵近似”的部分是特别感兴趣的。奇异值分解可以帮助您确定系统矩阵的真实排名。如果您的邻接图是稀疏的,那么您的系统矩阵(例如,N倍N矩阵)可能具有小于N的秩M.在这种情况下,您可以计算它的低秩近似。也就是说,你构造M倍M(M 编辑:在您的示例数据中,您的原始矩阵A已经被分解为A = outU svdOut outV。对角矩阵svdOut是A的特征值奇异值的一部分,而outU和outV的列/行分别是A的左奇异向量和右奇异向量。在您的示例中,奇异值为1.61803,1.41421,0.61803和0(两次)。因此,原始矩阵的等级由非零奇异值的数量给出(在您的示例中为三个)。因此,您可以定义矩阵B = outU svdOut * outV,其中星号表示已删除最不重要的奇异值。例如,您可以决定忽略最小的特征值,因此 然而,在再次考虑之后,我认为你的邻接矩阵的SVD不会直接给你你想要的东西。您必须以某种方式定义重要节点实际上在您的上下文中的位置。 Edit2(响应下面的评论):SVD不会为您提供有关节点的直接信息,而是提供有关矩阵的信息。奇异向量形成一个标准正交基,可用于以不同的形式表达原始矩阵。奇异值为您提供有关这些向量的影响有多强的信息。同样,Wikipedia可能会帮助您了解如何解释这一点。
回到你原来的问题,我认为一个简单的SVD并不是你想要的。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 |