如何使用MapReduce / Hadoop实现特征值计算?

时间:2008-12-23 06:29:45

标签: algorithm math hadoop mapreduce eigenvalue

这是可能的,因为PageRank是一种特征值形式,这就是MapReduce引入的原因。但实际实现中似乎存在问题,例如每台从属计算机都必须保留矩阵的副本吗?

5 个答案:

答案 0 :(得分:9)

PageRank通过迭代求解网络的稳态离散流条件来解决主导特征向量问题。

如果NxM矩阵A描述了从节点n到节点m的链路权重(流量),那么

p_{n+1} = A . p_{n} 

在p收敛到稳态(p_n + 1 = p_n)的极限中,这是特征值1的特征向量问题。

PageRank算法不要求矩阵保存在内存中,但在密集(非稀疏)矩阵上效率低。对于密集矩阵,MapReduce是错误的解决方案 - 您需要在节点之间进行局部性和广泛交换 - 而您应该看看LaPACK和MPI以及朋友。

您可以在wukong library(红宝石的hadoop流媒体)或Heretrix pagerank submodule中看到有效的pagerank实现。 (heretrix代码独立于Heretrix运行)

(免责声明:我是悟空的作者。)

答案 1 :(得分:6)

<强> PREAMBLE

鉴于数据的正确隔离,人们可以在每台机器上没有完整的数据集的情况下实现并行计算结果。

以下面的循环为例:

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        m[i][j]++; 
    }
}

给出以下布局的矩阵:

       j=0   j=1   j=2
 i=0  [   ] [   ] [   ]
 i=1  [   ] [   ] [   ]
 i=2  [   ] [   ] [   ]

存在并行结构,以便可以将J列发送到每台计算机,并且并行计算单列。当您拥有包含依赖项的循环时,并行化的难点就在于此。

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        //For obvious reasons, matrix index verification code removed
        m[i][j] = m[i/2][j] + m[i][j+7]; 
    }
}

显然,像上面那样的循环变得非常有问题(注意矩阵索引器。)但是存在用于展开这些类型的循环并创建有效的并行算法的技术。

<强> ANSWER

谷歌有可能开发出一种计算特征值的解决方案,而无需在所有从属计算机上维护矩阵的副本。 - 或 - 他们使用Monte Carlo或其他Approximation Algorithm之类的东西来制定“足够接近”的计算。

事实上,我甚至会说Google会尽可能地尽可能地使其PageRank算法的计算尽可能高效。当您运行thesethis等机器时(请注意以太网电缆),您无法传输大型数据集(100次演出),因为鉴于商用NIC卡的硬件限制,这是不可能的

话虽如此,谷歌擅长令程序员社区感到惊讶,他们的实施可能完全不同。

<强> POSTAMBLE

并行计算的一些好资源包括OpenMPMPI。两种并行实现都采用非常不同的范式进行并行计算,其中一些范式源于机器实现(集群与分布式计算)。

答案 2 :(得分:1)

我怀疑它对于大多数矩阵来说是难以处理的,除了那些具有特殊结构的矩阵(例如稀疏矩阵或具有某些块模式的矩阵)。矩阵系数和特征值之间的耦合太多了。

PageRank使用非常sparse matrix的特殊形式,计算其特征值的任何结论几乎肯定不会扩展到一般矩阵。 (编辑:这里看起来很有趣的another reference

答案 3 :(得分:1)

我现在可以自己回答。 PageRank算法利用稀疏矩阵,它应该在几个自乘的情况下收敛于特征值。因此,在PageRank练习中,Map / Reduce过程是有效的。您可以在Map过程中执行矩阵乘法,并在Reduce过程中形成稀疏矩阵。但对于一般的矩阵特征值发现,它仍然是一个棘手的问题。

答案 4 :(得分:1)

apache hama项目有一些Jacobi特征值算法的有趣实现。它运行在hadoop上。请注意,旋转发生在矩阵的扫描中,而不是在map reduce中。