Apriori算法中的候选集生成

Candidate set generation in Apriori algorithm

我正在尝试在 Java 中实现 Apriori 算法,但在生成候选项集时遇到了问题。为了创建 k-itemset 的候选项,我使用了 k-1 和 1-itemsets 的所有组合。例如,对于 频繁 1 项集: bread:9、milk:9、coffee:9、sugar:10。

生成的候选2项集应该是:面包牛奶、面包咖啡、面包糖、牛奶咖啡、牛奶糖、咖啡糖。

但是我的代码returns:面包咖啡,面包牛奶,面包糖,咖啡面包,咖啡牛奶,咖啡糖,牛奶面包,牛奶咖啡,牛奶糖,糖面包,糖咖啡,糖牛奶(所有排列;returns面包牛奶和牛奶面包,但是,这两者是一回事。

我的代码:

public static ArrayList<ArrayList<String>> getCandidates(Map<String, Long> one_itemset_1, Map<String, Long> n_itemset_1){
    ArrayList<ArrayList<String>> tuples = new ArrayList<ArrayList<String>>();


    Map<String, Long> one_itemset = sortbykey(one_itemset_1);
    Map<String, Long> n_itemset = sortbykey(n_itemset_1);

    for(String item : one_itemset.keySet()) {

        for(String item2 : n_itemset.keySet()) {
            if(!item.equals(item2) && !item2.contains(item)) {
                ArrayList<String> singleList = new ArrayList<String>();
                singleList.add(item);
                String item2_sep[] = item2.split(" ");
                for(int i = 0; i < item2_sep.length; i++)
                    singleList.add(item2_sep[i]);
                //singleList.add(item2);
                tuples.add(singleList);
            }
            //index2++;
        }
        //index2 = 0;
        //index1++;
    }

    return tuples;
}

有没有办法修改此方法以摆脱重复的项目集?请指教。谢谢。

Apriori 算法不要求您在 Lk 和所有 1-项集之间进行连接以获得 Ck+1。这种方法将具有更高的运行时间。相反,我们在前 (k-1) 个元素在两个 k 项集中相同的条件下将 Lk 与其自身连接:see here

至于代码中有重复项,您可以只在 1 项中定义一个顺序 (I1 < I2 < I3 ... In) 然后只考虑升序(或降序)的项目。这将使项目集保持排序 -> (I1, I3, I5) 是一个有效的项目集但是 (I1, I5, I3 ) 不是。

对于您的示例,使用两个 for 循环可以轻松完成此操作:

for (int i=0; i<k-itemsets.size()-1; i++){
    for(int j=i+1; j<k-itemsets.size(); j++){
        // compare k-itemsets here and join in ascending order to produce k+1-itemset
    }
}

如果您一开始不了解该算法,我还建议您查看其他资源。例如,the SPMF library 实现了与模式挖掘相关的最流行算法。