我正在尝试用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个或更少的事务,所以我认为代码还可以。