使用Apriori算法查找频繁项集?

时间:2018-07-01 10:43:29

标签: java for-loop apriori

我正在尝试用Java编写先验算法,但是面临有关频繁项集的问题。 我的最低支持是1%->每个项目集必须处于一个或多个事务中。 为了理解该算法,香港专业教育学院从基数1开始。

现在,尽管我计算的交易次数越多,但它可以处理少于4个交易,实现的正确性就越差。

private static void checkForFrequentItemSet() {
    ArrayList<String> transactions = collectTransactions();
    ArrayList<String> items = createItemList(); // First Iteration actually, C1
    int k = 1;
    // while(!items.isEmpty())
    // {
    items = generateCandidates(items, k);
    System.out.println("There are exactly " + items.size() + " frequent itemsets containing " + k + " item(s):");
    System.out.println(items);// Remember this is c1 at first iteration
    k++;
    ArrayList<String> finalItems = new ArrayList<String>();
    for (String t : items) // For every candidate
    {
        int threshold = 0;
        int counter = 0;
        String[] singleContents = t.split(" "); // get single candidates
        List<String> singleItem = Arrays.asList(singleContents);
        System.out.println(singleItem);

            for (String i : transactions)
            {
                String[] singleTransa = i.split(" ");// and single transaction elements
                List<String> singleTransaList = Arrays.asList(singleTransa);
                for (String c : singleTransaList)
                {
                    if (singleItem.contains(c)) 
                    {
                        counter++;
                    }
                }

            }
        if (counter == singleItem.size()) // If Transaction i contains all elements of of one itemset 
        {threshold++; System.out.println(t+":"+counter);}
        if (threshold >= min_sup) // iff the treshold is greater than a min sup
        {finalItems.add(t); System.out.println(t);}
        else
        {
            System.out.println("Not found: "+t);
        }
    }
    items = finalItems;

    System.out.println(items.size());
    // }
}

我使用此方法检查事务是否包含候选者,如果包含,则将候选者添加到列表中。 因为它可以处理3个或更少的事务,所以我认为代码还可以。

0 个答案:

没有答案