我有一个非常大的节点网络,由邻接矩阵表示。我想减少网络中的节点数量以包含更重要的节点。我知道 SVD 可以帮助我实现这一目标,并且我已经使用 ILNumerics 库在邻接矩阵上运行 svd() 方法。
有人可以简单地向我解释输出是如何帮助我减少网络维度的吗? SVD 过程给我留下了一个大小相同的矩阵,其值对角线递减,范围从 ~2 到许多 0。我如何知道要删除哪些维度,哪些维度被认为不重要?
我可能总体上错误地执行了此过程,因此将不胜感激任何帮助!许多在线解释很快就会变得非常困惑。
最佳答案
我对 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 不会为您提供关于节点的直接信息,而是关于矩阵的信息。奇异向量形成一个标准正交基,可用于以不同形式表达原始矩阵。奇异值为您提供有关每个向量的影响有多强的信息。同样,Wikipedia可能会帮助您了解如何解释这一点。 回到您最初的问题,我认为简单的 SVD 并不是您真正想要的。
关于c# - 奇异值分解——社会网络分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14911315/