我编写了以下代码,用于从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,它将再次用作生成其他候选项集的输入。
答案 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