Генерация набора кандидатов в алгоритме Apriori - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь реализовать алгоритм 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;
}

Есть ли способ изменить этот метод, чтобы избавиться от повторяющихся наборов предметов? Пожалуйста, порекомендуйте. Спасибо.

...