从2个项目集创建k -itemsets

时间:2013-06-15 16:37:38

标签: java for-loop data-mining apriori

我编写了以下代码,用于从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-itemsets的条件是clist1(i)== clist2(i),其中i = 1,...,k-2和clist1(k-2)!= clist2(k-2) 。但是在我放**的代码中有错误。我怎样才能解决这个问题?逻辑是这个函数生成candidateItemsets,它将再次用作生成其他候选项集的输入。

2 个答案:

答案 0 :(得分:0)

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

此外,如果您想从函数返回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(正确类型)。

答案 1 :(得分:0)

如果您考虑根据词汇顺序对每个项目集列表进行排序,则可以进一步优化该代码。

例如,让我们说

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

clist2 = BD,FE,FG,FH,FI

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

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

如果您想查看Apriori优化实现的代码,可以查看我的open source data mining library named SPMF