Mahout关联规则算法源码分析(2)

来源:互联网 发布:淘宝网鲜花图片素材 编辑:程序博客网 时间:2024/05/17 07:26

上次说到这个函数:

public final void generateTopKFrequentPatterns(Iterator<Pair<List<A>,Long>> transactionStream,                                                 Collection<Pair<A, Long>> frequencyList,                                                 long minSupport,                                                 int k,                                                 Collection<A> returnableFeatures,                                                 OutputCollector<A,List<Pair<List<A>,Long>>> output,                                                 StatusUpdater updater)
调用了一个同名的函数,然后同名的函数又引入了FPTree。那么上面这个函数是如何调用其同名的函数呢?如下:

generateTopKFrequentPatterns(new TransactionIterator<A>(transactionStream,        attributeIdMapping), attributeFrequency, minSupport, k, reverseMapping        .size(), returnFeatures, new TopKPatternsOutputConverter<A>(output,            reverseMapping), updater);
这里先分析下FPTree的各个属性:

   int[] attribute;   int[] childCount;   int[] conditional;   long[] headerTableAttributeCount;   int[] headerTableAttributes;   int headerTableCount;   int[] headerTableLookup;   int[][] headerTableProperties;   int[] next;   int[][] nodeChildren;   long[] nodeCount;   int nodes;   int[] parent;   boolean singlePath;   final Collection<Integer> sortedSet = new TreeSet<Integer>();
其中的非header开头的属性当和TransactionTree的属性一样,可参考前一篇博客;这里header开头的属性则是属FPTree特有的,各个属性的含义如下:headerTableAttributes:项目名称(由于前面做过编码转换,所以此处为int型数据);headerTableAttributeCount:项目出现的次数;headerTableProperties:项目在树中首次出现的id和最后一次出现的id;next:同一个项目在树中下一个id;

接着看同名函数,其定义如下:

private Map<Integer,FrequentPatternMaxHeap> generateTopKFrequentPatterns(    Iterator<Pair<int[],Long>> transactions,    long[] attributeFrequency,    long minSupport,    int k,    int featureSetSize,    Collection<Integer> returnFeatures, TopKPatternsOutputConverter<A> topKPatternsOutputCollector,    StatusUpdater updater)
进入函数体内可以看到其建树包含两部分:其一:添加headerTable相关内容,或者说是初始化headerTable

FPTree tree = new FPTree(featureSetSize);    for (int i = 0; i < featureSetSize; i++) {      tree.addHeaderCount(i, attributeFrequency[i]);    }
其二,是添加事务到FPTree上:

 while (transactions.hasNext()) {      Pair<int[],Long> transaction = transactions.next();      Arrays.sort(transaction.getFirst());      // attribcount += transaction.length;      nodecount += treeAddCount(tree, transaction.getFirst(), transaction.getSecond(), minSupport, attributeFrequency);      }
这里起主要作用的便是treeAddCount()函数,这个函数不仅像之前TransactionTree那样建立了一棵树,同时有把相关信息添加到headerTable中和next中。
比如刚开始的原始数据,经过排序、删除、编码和相加后的数据展现如下:

{[1]2}{[1,3]5}{[2]1}{[2,4]1}{[0,2]1}{[0,2,4]4}{[0,4]2}{[3]2}
则把上面的数据添加到FPTree树上的结果如下:



其相应的headerTable如下:


通过调试,打印出来的FPTree如下:

[FPTree  -{attr:-1, id: 0, cnt:0}-0->-{attr:1, id: 1, cnt:7}-0->-{attr:3, id: 2, cnt:5}                          -1->-{attr:2, id: 3, cnt:2}-0->-{attr:4, id: 4, cnt:1}                          -2->-{attr:0, id: 5, cnt:7}-0->-{attr:2, id: 6, cnt:5}-0->-{attr:4, id: 7, cnt:4}                                                     -1->-{attr:4, id: 8, cnt:2}                          -3->-{attr:3, id: 9, cnt:2}]
至此,FPTree就建好了,剩下的工作就是挖掘每棵FPTree了。


分享,快乐,成长


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


原创粉丝点击