分布式算法设计
1).MapReduce
![v2-40f4fee2a4c2eb92915d2834f88fdeef_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-40f4fee2a4c2eb92915d2834f88fdeef_b.jpg)
![v2-2fc088bad8469d22f4df331521a401e6_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-2fc088bad8469d22f4df331521a401e6_b.jpg)
在Map和Reduce两个基本算子抽象下,所谓Hadoop和Spark分布式计算框架并没有本质上的区别,仅仅是实现上的差异。阅读了不少分布式算法的实现(仅仅是实现,不涉及原理推导),大部分思路比较直观,大不了几个阶段的MapReduce就可以实现。这里主要介绍一个曾经困扰我好久且终于柳暗花明的问题,即“大规模稀疏矩阵乘法”。
![v2-755b27c580ad79897e2c3267744c2e25_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-755b27c580ad79897e2c3267744c2e25_b.jpg)
上图单元格中的数字为归一化处理后的每个用户对每个商品的行为分值,是一个高维的稀疏矩阵(比如有1亿商品,5000万的用户),假设矩阵为
![v2-f1db997a803c7d826d618cacd209472e_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-f1db997a803c7d826d618cacd209472e_b.png)
在传统的推荐召回策略(Item-based、User-based等)中,核心就是计算实体对(<商品,商品>或<用户,用户>)间的相似度。目前大多数介绍"Item-based"或"User-based"的博文中,多是统计曾共同出现在同一session内的实体对的相似度或共现频次。这里所谓的session是指用户在一次购物过程共同点击过的商品或共同加入购物车的商品或共同下单的商品。下面举一个简单的例子。
假设,我们已经有用户历史下单数据,在此基础上研发一个简单基于Item-based的推荐系统。
首先,由用户session(用户已购买商品)构建<商品i,商品j>共现矩阵(Co-occurrence Matrix)。
![v2-6aa9c1d23b5bdec603e83dd7257796a1_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-6aa9c1d23b5bdec603e83dd7257796a1_b.jpg)
其次,归一化共现矩阵。
![v2-5cbb1148a3061c7d75af4c2f33d8536b_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-5cbb1148a3061c7d75af4c2f33d8536b_b.jpg)
最后,根据每个用户的历史行为对未购买的商品做出预测打分,并做出推荐。
![v2-18d94cc2704403b7606c37b21ff254ad_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-18d94cc2704403b7606c37b21ff254ad_b.jpg)
上述方法在实际生产环境中得到了广泛应用,但也有其局限性。
优点:
1).计算复杂度低。
2).实现简单适于业务早期快速上线。
缺点:
1). 数据稀疏问题加剧。仅仅统计session共现,不能覆盖所有的Pair。
2).表达力有限。常见Pair相似度计算方法有余弦相似度、欧式距离相似度等,显然上述方法不太容易替换相似度计算方法。
上文参考自:
https://www.jianshu.com/p/318bfacb4b5ewww.jianshu.com所以更通用的策略是计算”全域商品“的两两之间的相似度,即前文提到的
![v2-8c0d506392bc6bdb7197bc182443e563_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-8c0d506392bc6bdb7197bc182443e563_b.jpg)
那
![v2-3935b57b639d1fb0f61128656235058b_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-3935b57b639d1fb0f61128656235058b_b.jpg)
这里简单介绍一种在生产环境中已经验证过的方法。如上图,为了实现分布式,先将A矩阵分成K个行分块,
暂时先介绍下思路。更详细请期待<<策略算法工程师之路>>,届时会有更完整的流程及代码,在工程实现上还是有很多的trick的。
![v2-1ff2d2729f91145988997939c5c9bb44_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=78b1ca9a-ed2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-1ff2d2729f91145988997939c5c9bb44_b.jpg)