我有一个篮子清单。每个篮子包含30个项目。我还有一个购买历史列表,其中包含在特定日期购买的商品,无论是谁购买的。数据如下所示:
Basket1:item1,item2,item3,item4 .. item30
第1天:item_x1,item_x2,item_x3 .... item_xn
篮子总数为4000.不同物品的总数为15000。
我想根据主导特定日子的篮子的概率每天得分。
p(basket_1|day_1) = p(basket1_item1|day_1) * p(basket1_item2|day_1) * p(basket1_item3|day_1) * ...* p(basket1_item30|day_1) ---> (Formula 1)
平滑给定特定日期的项目的概率。换句话说,无论该项目是否在该特定日期购买,都必须计算。
这对所有日子的所有篮子都有效。我想加快处理时间,目前的方法如下:
1-对每个特定日期的所有项目(15000项)进行评分,无论它们是否在当天发生。每天购买的商品数量小于此数(平均800件),但由于需要进行所有这些计算,我只需要一次。
2-迭代每个项目(t)并执行以下操作:
a-如果 b 包含 t ,请检查每个购物篮(b)是否包含 t :
a.1通过计算上面的公式1更新篮子,不要再次检查或对此篮子做任何事情。
项目分数存储在
中 TObjectDoubleHashMap<String> itemScore;
篮子得分存储在
中 TObjectDoubleHashMap<String> basketScore;
要更新购物篮,请执行以下操作:
Iterator<String> itr=baskets.get(basket).iterator();
String item=null;
while(itr.hasNext()){
item=itr.next();
sum+= itemScore.get(item);
}
sum= sum / (baskets.get(basket).size() * 1.00d);
basketScore.put(basket, sum);
我很好奇是否有更有效的方法来进行更新或解决此任务。
答案 0 :(得分:1)
您应该能够通过使用一些智能数据结构加快速度。
例如:
Map<Item, List<Basket>> basketsForItems; // populate for all baskets
Map<Basket, Integer> basketCount; // populate with 0 for all baskets
然后对于你刚才做的每件事:
for (Basket b: basketsForItems.get(item)) {
basketCount.put(basket, basketCount.get(basket)+1);
}
Hashcode查找应该比扫描列表要快得多。
显然这是简化的,因为它没有查看关于天等的规则,但希望你能得到这个想法。