FHM算法

493 阅读2分钟

写在前面:本算法为 HUI-Miner 的改进算法,在原有的基础上增加了一些新的数据结构,通过减少生成 utility-list 的数量,进而达到提高运行效率的目的。 ———— By Suarne

Faster High-Utility Itemset Mining using Estimated Utility Co-occurrence Pruning

有关算法的绝大部分定义可以直接参考 HUI-Miner,本算法的关注点在于 HUI-Miner 是通过“并”操作实现生成高阶项集的信息,然而,在项的数量较多的情况下,两两相交的操作在检索列表过程中是比较耗费时间,并且对于稠密型数据集,长期维持大量的 utility-list 在内存中也是不小的开支,所以,该算法作者从减少 二阶项集 的数量来在一定程度上解决该问题

Estimated Utility Co-Occurrence Structure

在使用 TWU 的反单调性对所有的 item 进行过滤后,对剩下的 item 进行笛卡尔积运算,形成一个新的元组,即(x, y, z={TWU(xy​)})显而易见的是,使用一个矩阵来表示这个元组是最简单的,一方面由于在 HUIM 领域中,项集 xy 是等同于 yx​​​​,所以该矩阵为左下(右上)三角矩阵。通过再次扫描数据集,可以得到下右表:

TWU_and_EUCS.png

Ps. 当 z 为 0 时,可以不用存储该值

Estimated Utility Co-occurrence Pruning

同样是利用 TWU 的反单调性来进行剪枝,这样可以过滤掉二阶项集

Code

这里使用 HashMap 的嵌套结构来实现 EUCS

 int newTWU = 0;
 ​
 // 使用列表存储 item
 List<Pair> revisedTransaction = new ArrayList<Pair>();
 // 对于每一条交易项中的每个 item(items是记录某条交易项中所有 item 的字符型数组)
 for (int i = 0; i < items.length; i++) {
     // 原数据集中的 item 是字符型,这里转变为整型
     Pair pair = new Pair();
     pair.item = Integer.parseInt(items[i]);
     pair.utility = Integer.parseInt(utilityValues[i]);
     
     // 如果该 item 是 promising
     if (mapItemToTWU.get(pair.item) >= minUtility) {
         // 记录在 EUCS 中
         revisedTransaction.add(pair);
         remainingUtility += pair.utility;
         newTWU += pair.utility;
     }
 }
 ​
 // -------------- 分 -------------- 割 -------------- 线 -------------- //
 // 注意区分 mapFMAP(行元素) 和 mapFMAPItem(列元素)
 Map<Integer, Integer> mapFMAPItem = mapFMAP.get(pair.item);
 if (mapFMAPItem == null) {
     mapFMAPItem = new HashMap<Integer, Integer>();
     mapFMAP.put(pair.item, mapFMAPItem);
     }
 ​
 for (int j = i + 1; j < revisedTransaction.size(); j++) {
     Pair pairAfter = revisedTransaction.get(j);
     Integer twuSum = mapFMAPItem.get(pairAfter.item);
     
     if (twuSum == null) {
         mapFMAPItem.put(pairAfter.item, newTWU);
     } else {
         mapFMAPItem.put(pairAfter.item, twuSum + newTWU);
     }
 }

总结

总的来说,该算法还是比较简单易懂,对 HUI-Miner 算法的整体改进并不大,而且该算法提出的 EUCS 结构仍然存在很大的改进空间(详情可以参考 KHMC 算法)。但是该算法相较于 HUI-Miner 快了将近 6 倍,并且由于减少了无效的二阶项集生成,很大程度上降低了后续不同 utility-list 之间的“交”操作。

引用

FHM:Faster High-Utility Itemset Mining using Estimated Utility Co-occurrence Pruning

KHMC:An efficient algorithm for mining the top-k high utility itemsets, using novel threshold raising and pruning strategies