非负矩阵分解算法思想如下:
并行化思路:
由公式(2-8)和(2-9)可以看出,矩阵更新所需要的主要操作就是矩阵之间的乘法运算,并行化操作也主要是对乘法运算进行并行,对矩阵H的并行化步骤如下:
并行化算法设计:
针对以上的并行化流程,并行化步骤如下:
算法实现和结果:
算法采用hadoop streaming实现,矩阵采用稀疏结构进行存储,部署在5个计算节点,每个节点为8核心,设置的map数量为0.75*cores,其中cores为集群所有的核心数,鉴于集群配置都是一样的核数,所以是乘以0.75,如果配置一样,这个需要根据具体情况进行调优。在运算过程中,矩阵会越来越稀疏,运算速度会越来越快。矩阵A维度为280W*50W,topic的数量设置为200,迭代一轮大概10min到最后的5min左右。代码比较糙,就不放出来了,有问题可以一起交流讨论下。
算法需要改进的方面:
1.稀疏性的问题,如何添加稀疏性约束来产生比较稀疏性的解?
2.运算速度的提升,根据实验跑出来的结果,迭代一轮平均10分钟,一个小时才迭代6轮,算法需要进行多轮迭代,这个基本不能承受,当然这个根据集群的节点数量有一定的关系,考虑到目前语料集合比较小,而且扩展集群节点数量不太可能,有机会可以试试MPI上运行效果。