我正在做一个简单的协同过滤(CF)。它是一个项目对项目CF。 例如,我有一个包含N个项目的巨型dict,其中key是产品名称,value是购买它们的客户列表:
d={
item1:[customer1,customer3,customer7],
item2:[customer3, customer5],
...
itemN:[customerX...customerY]
}
我还有一个小函数,可以计算每个项目之间客户的相似性,例如第1项与第2项之间的相似性:
^{pr2}$为了获得每个指定项的最相似项,我必须扫描,计算N次相似性,然后排序。所以对于N个项目,复杂性是O(N*N)
。在
现在每个项目的运行时间为2分钟(N约为300万)。生成一个完整的N*N相似性表需要100000个小时。有比这种暴力方法更好的算法吗?每个项目只需要前几个结果。在
创建一个反向索引,该索引具有:
然后您可以:
你每件物品的时间应该从2分钟减少到2秒以内。在
第二个索引需要更多的内存,但您不会复制数据。如果内存有问题,您可以将其存储在一个简单的数据库中,而且仍然比您当前使用的N^2算法快得多。在
更多细节
您需要创建一个N*N矩阵来显示任意两个项之间的相似性。使用我的技巧,您可以执行以下操作:
^{pr2}$这与@Jim Mischel的回答基本相同,即构建一个显式的反向索引,但不构建显式的NxN矩阵,它是整个系统的实现而不是草图。在
对于大量的NUM_客户(比如1000000个),它的性能不是很好(对于3个类似的检查,大约20秒),但是数据是随机的。据推测,实际客户购买数据中的相关性会更高,随机性也会更少。在
首先,构建一些用于测试的合成数据:
然后定义几个函数:
^{pr2}$然后,运行它:
得到的结果如下:
相关问题 更多 >
编程相关推荐