Mahout关联规则算法源码分析--如何分数据

59 篇文章 0 订阅
5 篇文章 0 订阅

FP树的并行的大概算法就是把数据分小(并不是简单的分,分完后可以保证没有丢失频繁项),然后再使用每份小数据进行建树、挖掘树。那么mahout的FPGrowthDriver是如何分数据呢?其实前面也大概说了下,只是不是很特别的说明,在这里举例来说明:

比如如下的f-list: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] ,

事务集如下:

[0,1,2,4,7,8,9,10,11,12]
[1,4,5]
[1,5,10,13]
[5,14]
[5,6,7]

假设根据f-list和上面的事务集建立的fp-tree比较大,放入不了内存,那么可以考虑把数据分为两组,那么按照mahout的做法是g-list分别如下:

 [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]和 [0,1,2,3,4,5,6,7]

其相应的事务集分别对应如下:

[0,1,2,4,7,8,9,10,11,12]
[1,5,10,13]
[5,14]

[0,1,2,4,7]
[1,4,5]
[1,5]
[5]
[5,6,7]
这样一来,建立了两个fp-tree,并且这两个fp-tree都比原来的那个要小,可以完全放入内存了。(不过这样挖掘出来的频繁项不会丢失,但是会有重复,)。

最后贴上mahout里面分数据的代码:

    String[] items = splitter.split(input.toString());

    OpenIntHashSet itemSet = new OpenIntHashSet();

    for (String item : items) {
      if (fMap.containsKey(item) && !item.trim().isEmpty()) {
        itemSet.add(fMap.get(item));
      }
    }

    IntArrayList itemArr = new IntArrayList(itemSet.size());
    itemSet.keys(itemArr);
    itemArr.sort();
    OpenIntHashSet groups = new OpenIntHashSet();
    for (int j = itemArr.size() - 1; j >= 0; j--) {
      // generate group dependent shards
      int item = itemArr.get(j);
      int groupID = PFPGrowth.getGroup(item, maxPerGroup);
        
      if (!groups.contains(groupID)) {
        IntArrayList tempItems = new IntArrayList(j + 1);
        tempItems.addAllOfFromTo(itemArr, 0, j);
        context.setStatus("Parallel FPGrowth: Generating Group Dependent transactions for: " + item);
        wGroupID.set(groupID);
        context.write(wGroupID, new TransactionTree(tempItems, 1L));
      }
      groups.add(groupID);
    }


分享,快乐,成长


转载请注明出处:http://blog.csdn.net/fansy1990 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值