Я пытаюсь реализовать алгоритм Apriori в Java, и возникают проблемы с генерацией наборов элементов-кандидатов. Для создания кандидатов на набор k-элементов я использую все комбинации наборов k-1 и 1-элементов. Например, для Frequent 1-itemset: хлеб: 9, молоко: 9, кофе: 9, сахар: 10.
Сгенерированные кандидаты из 2-х наборов должны быть: хлебное молоко, хлебный кофе, хлебный сахар, молочный кофе, молочный сахар, кофейный сахар.
Но мой код возвращает: хлеб кофе, хлебное молоко, хлебсахар, кофейный хлеб, кофейное молоко, кофейный сахар, молочный хлеб, молочный кофе, молочный сахар, сахарный хлеб, сахарный кофе, сахарное молоко (все перестановки; возвращает как хлебное молоко, так и молочный хлеб, однако эти две вещи - одно и то же).
Мой код:
public static ArrayList<ArrayList<String>> getCandidates(Map<String, Long> one_itemset_1, Map<String, Long> n_itemset_1){
ArrayList<ArrayList<String>> tuples = new ArrayList<ArrayList<String>>();
Map<String, Long> one_itemset = sortbykey(one_itemset_1);
Map<String, Long> n_itemset = sortbykey(n_itemset_1);
for(String item : one_itemset.keySet()) {
for(String item2 : n_itemset.keySet()) {
if(!item.equals(item2) && !item2.contains(item)) {
ArrayList<String> singleList = new ArrayList<String>();
singleList.add(item);
String item2_sep[] = item2.split(" ");
for(int i = 0; i < item2_sep.length; i++)
singleList.add(item2_sep[i]);
//singleList.add(item2);
tuples.add(singleList);
}
//index2++;
}
//index2 = 0;
//index1++;
}
return tuples;
}
Есть ли способ изменить этот метод, чтобы избавиться от повторяющихся наборов предметов? Пожалуйста, порекомендуйте. Спасибо.