0

我编写了以下代码来从 2 元素集生成 k 元素项集。这两个元素集作为 clist1 和 clist2 传递给 CandidateItemsetGen。

    public static void candidateItemsetGen(ArrayList<Integer> clist1, ArrayList<Integer> clist2) 
        {
            for(int i = 0; i < clist1.size(); i++)
            {
                for(int j = i+1; j < clist2.size(); j++)
                {
                   for(int k = 0; k < clist1.size()-2; k++)
                   {
                       int r = clist1.get(k).compareTo(clist2.get(k));
                       if(r == 0 && clist1.get(k)-1 == clist2.get(k)-1)
                       {
 **                           candidateItemset.add(clist1.get(i), clist1.get(clist1.size()-1), clist2.get(clist2.size()-1));
                       }
                   }
                }
            }
//    return candidateItemset;
        }

创建 k 项集的条件是 clist1(i) == clist2(i),其中 i = 1,...,k-2 和 clist1(k-2) != clist2(k-2)。但是我放**的代码中有错误。我怎样才能解决这个问题?逻辑是该函数生成候选项目集,这些候选项目集将再次用作生成其他候选项目集的输入。

4

2 回答 2

0

如果您认为每个项集列表都根据词法顺序排序,则可以进一步优化该代码。

例如,假设

clist1 = AB、AD、AF、AG、BC、FG

clist2 = BD、FE、FG、FH、FI

使用您的代码,您将 AB 与 clist2 的所有项集进行比较。

但是您可以通过在 BD 之后立即停止来优化它,因为根据词汇顺序,B 大于 AB 中的 A。因此,Clist2 中 BD 之后的项集都不会与 AB 匹配。

如果想看 Apriori 优化实现的代码,可以查看我的开源数据挖掘库 SPMF

于 2013-09-06T14:42:04.047 回答
0

ArrayList 中的add方法最多需要两个参数,而您要传入三个。如果您想添加所有三个项目,请调用add(Integer i)3 次。

此外,如果candidateItemsets要从函数返回,则必须声明ArrayList<Integer>返回值并创建列表:

public static ArrayList<Integer> candidateItemsetGen(ArrayList<Integer> clist1, ArrayList<Integer> clist2) {
  ArrayList<Integer> candidateItemset = new ArrayList<Integer>();

  for (int i = 0; i < clist1.size(); i++) {
    for (int j = i + 1; j < clist2.size(); j++) {
      for (int k = 0; k < clist1.size() - 2; k++) {
        int r = clist1.get(k).compareTo(clist2.get(k));
        if(r == 0 && clist1.get(k) - 1 == clist2.get(k) - 1) {
          candidateItemset.add(clist1.get(i));
          candidateItemset.add(clist1.get(clist1.size() - 1));
          candidateItemset.add(clist2.get(clist2.size() - 1));   
        }        
      }
    }
  }

  return candidateItemset;
}

如果要将所有三个添加为一组相关值,请将它们一起存储在单独的数据结构中并将其添加到candidateItemset正确类型)。

于 2013-06-15T16:55:31.970 回答