我正在开发协同过滤项目,我需要使用大致如下的算法:
itemset = set {item_1, item_2, item_3... item_n}
for (item_1 to item_n) // for each item in itemset
{
for (item_2 to item_n) // consider item_1's iteration
{
x = similarity (item_1, item_2) // calculate similarity of item_1 with item_2
store x in a file
}
}
如果以串行方式运行,此代码将在O(n^2)
时间内运行。
similarity
是一个返回item_x
和item_y
之间相似性的函数。
我知道我可以在mapreduce范例中运行此代码,因为每个项目 外部 循环 迭代对于项目集中的所有项目是独立的,并且每个映射器可以在O(n)
时间内计算1个项目与其他项目的相似度。
但是我不确定如何进行实施。项目集和这些项目的功能都在一个大的单个文件中。我的困惑从那里开始。
我是否让每个映射器将项目特征矩阵存储在自己的内存中?然后每个映射器计算一个项目与其余项目的相似度?我应该如何实施?
我将使用Hadoop-streaming读取我认为的文件。但是,如何在每个映射器中存储其他项目及其功能?我可以使用常规数据结构来存储项目及其功能吗?但每个映射器都不会将其他所有项目作为输入,这是我的困惑。
任何形式的想法,建议或链接到描述如何执行此操作的文章的帮助将不胜感激。 谢谢!