至上次重写ID3 MR版之后,手贱继续尝试CF。之前耳闻CF这两年内非常火,论内某大神也给了单机版(90%代码来自于其)。所以想试试能否改到MR上。整体来说,CF本身的机制以相似性为核心,与迭代调用几乎无关联。所以在MR上的表现,未必能完全发挥MR作用。基本上是线性路子,一走到底。原先网上也有不少CF的介绍,不过以文文图图居多,对CF的时序性逻辑表达较少,讲的比较隐晦,现在通过代码剖析重新将其展现在大家面前(纯粹理论此处略过):
先贴图,贴图是王道:
1,整个MR过程其实与单机版90%重叠。仅期望在Mapper过程中,尽可能地先构建后评分矩阵,减少Reducer压力。
2,与大多数机器学习特性一样,既期望用小样本来预测未来。本想在Mapper 过程中同时构建neighbour,但是如果不是太过追求最终成功率,可以值得一试。
3,对于CF中以用户平均分作为一个大结果因素这件事,不是很赞同,多少显的有些粗糙。应该还有更好地观测手法,比方说标差、正态、二项式都是很好的选择。
3,为了加快文本读取速度,取消了标入的同步。std::ios::sync_with_stdio(false);
4,最终结果如下:
5,原始文本如下:
6,源代码如下:
https://github.com/zacard-orc/Zacard_CF
望各位看官手下留情。。。。^)^