我尝试在Hadoop中实现特征向量中心性,其中我们有一个如下的迭代(r是一个向量,A是一个矩阵):
r_i+1 = A*r_i
r_i+1 = r_i+1/||r_i+1||
在哪里||表示向量的范数。A在一个.txt文件中,r是一个向量,初始化为[1 1 1 1 ...],大小为n,与A兼容。我认为,由于我需要r_i来计算r_(i+1),因此我无法并行化循环,但我可以并行化计算本身。但我不确定如何做到这一点。我的初步想法是:
- 将向量初始化为全局变量
- 在Map阶段,其中j是组件的索引,计算r[j]*A[j,:],即r乘以行的第j个位置的值。这将产生一个新行,其中包含多个值,并且所有值都具有相同的键(j)。
- 在reduce阶段,将每个密钥的所有密钥j的值加在一起,这将等价于新的向量r(归一化前)。
- 在main函数中手动规范化矢量,然后重新执行该过程。
然而,我对这个想法有几个问题:以使用全局变量为向量为例,如第一个:我不知道从性能的Angular 来看,这是否合理,其次:我不知道如何用reduce阶段的结果更新向量。
我发现的另一个问题是我不知道如何重复运行它,我用Java实现了一个,所以我有一个Mapper类和一个Reducer类,我在main函数中调用了jobs,但是我能把它变成一个迭代吗?
1条答案
按热度按时间okxuctiv1#
我相信this提供了一个很好的例子,也适用于您。
Map步骤可以计算每个元素r_(t + 1)[i] = A[i,:] * r_(t)/||r_(t)||,然后打印出来,这样还原器就可以抓取它。
你的reduce步骤只需要获取输入,然后组装最终的向量。