c# - 奇异值分解——社会网络分析

标签 c# .net social-networking svd

我有一个非常大的节点网络,由邻接矩阵表示。我想减少网络中的节点数量以包含更重要的节点。我知道 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/

相关文章:

c# - 从通用方法调用中转换结果?

c# - 没有从 'System.Collections.Generic.List<T>' 到 'T' 的隐式引用转换

c# - Caliburn Micro Xamarin 的数据绑定(bind)操作顺序

.net - 无法从 C# .Net Core 应用程序连接并获取 Sharepoint 数据

django - 使用 Django 分享到社交页面

C# 抽象类实现

c# - 有条件地允许在 FormView 中进行编辑吗?

c# - SqlConnection 问题,ASP.net C#

php - 为新站点用户自动创建自定义页面(或 URL) - PHP

mysql - 在社交网络设计中使用外键——好/坏?