2010-09-25 2 views
2

Я делаю приложение, которое будет вычислять все 2 размера частых наборов предметов из набора транзакций. То есть приложение будет иметь в качестве входного файла данных (текстовый файл с разделителями пространства - с элементами, закодированными как целые числа) и процент, заданный как целое число (например, вход 2 представляет 2%). Приложение будет выводить в отдельный файл каждую пару чисел, которые отображаются вместе в одной транзакции (транзакция представлена ​​одной строкой в ​​файле) более чем в 2% от всех транзакций (где 2% - это процент, указанный во входном). Выходной файл будет содержать каждую пару элементов в строке вместе с их поддержкой (количество транзакций, где они появляются), и приложение будет выводить (на экране в файле) продолжительность (время, необходимое для выполнения задачи) ,приложение о генерации пар частых наборов предметов

файл данных будет как

55 22 33 123 231 414 

21 43 432 435 231 4324 534 

22 21 33 123 231 534 666 222 

... 

каждая строка называется транзакцию, и входной файл содержит тысячи транзакций. Сначала я думаю об использовании правила интеллектуального анализа данных, чтобы найти все одиночные числа, частота появления которых превышает 2% в каждой транзакции, а затем формировать пары для каждой транзакции и, наконец, сравнивать каждую пару и генерировать выходной файл.

У кого-нибудь есть некоторые идеи или код для этого, пожалуйста, помогите, если у вас есть код (лучше в java) для этого, что будет очень полезно Спасибо большое.

+1

Нам нужна дополнительная информация. Используя ваши данные, какой будет выходной образец? –

+0

выход должен быть похож на содержащий пары чисел с их частотой witch имеет> = 2% частоту появления, спасибо – starcaller

+0

http://stackoverflow.com/questions/3847079/how-to-get-the-most-frequent-items –

ответ

3

Вот один из способов подсчета целых чисел.

public class IntCount { 

    public static void main(String[] args) { 
     count("123 234 456 678 789 234 234 123"); 

    } 

    public static void count(String transactionLine) { 
     String[] parts = transactionLine.split(" "); 

     Map<String, Integer> hashTable = new HashMap<String, Integer>(); 
     // Count duplicates 
     for (String s : parts) { 
      if (hashTable.get(s) == null) hashTable.put(s, 1); 
      else hashTable.put(s, hashTable.get(s) + 1); 
     } 

     for (String s : hashTable.keySet()) { 
      System.out.println("s: " + s + " count: " + hashTable.get(s)); 
     } 
    } 
} 

Теперь вы можете начать работу с определения части 2%.

+0

, вы думаете, что это будет лучше сначала сохранить все сохраненные числа, а затем сохранить все возможные пары в массиве парных объектов? Я написал парный класс для представления объекта, и он отлично работает для тестовых данных, но я не уверен, что это эффективное решение. – starcaller

+0

Похоже, мы можем сделать это на одной линии/транзакции за раз, которая будет экономить ресурсы. Однако я не могу сказать, что понимаю 2% -ную часть. Если транзакция имела 100 целых чисел, а 3 из них были одинаковыми, это было бы 3%? –

+0

Похожие решения: http://stackoverflow.com/questions/3847079/how-to-get-the-most-frequent-items –

1

Выполняйте каждую транзакцию по одной за раз. Для каждой транзакции найдите все парные пары. Поместите их в HashTable<Integer,Integer> с номером в качестве ключа и значением 1. Если уже есть запись, увеличьте значение.

После того, как вы обработали все транзакции, просмотрите HashMap и найдите значения, превышающие 2% от общего количества транзакций. Это ваши победители.

Они могут выводиться непосредственно в файл или сохраняться в другой структуре данных для сортировки в первую очередь.

+0

но как вы можете сравнить пары в хэш-таблице, я имею в виду, на ваш взгляд, вы храните все пары чисел в хеш-таблице и задаете значение ключа, чтобы указать время появления – starcaller

+0

. Я думаю, используя парный объект для хранения пары, созданные из каждой транзакции, таким образом, вы можете легко сказать, какие пары идентичны и записывать время показа. Но я не уверен, как это можно сделать в хеш-таблице, можете ли вы быть более подробным, пожалуйста, – starcaller

0

Что вы хотите сделать, в основном найти все все frqequent 2-itemsets. И набор элементов, который имеет элементы «k», называется k-itemset. Самый простой способ для вашей задачи - изменить любую реализацию apriory с открытым исходным кодом в java, чтобы остановить перечисление наборов предметов, после нахождения всех частых 2-предметов. Это было бы не так сложно, потому что Apriori, начиная с подсчета всех 1 наборов предметов, затем он принимает все частые 1-предметы, генерирует кандидаты 2-набора элементов, используя их, снова проверяет базу данных, подсчитывает поддержку для этих кандидатов 2- набор предметов, выбирает частые, генерирует кандидат 3 набора предметов и т. д. ... Например, предположим, что частые 1 предметы являются следующими a, c, d Затем алгоритм генерирует все возможные 2 набора элементов, как показано ниже: ac, ad, cd Подсчитывает их поддержку, снова просматривая базу данных и отфильтровывая нечастые.

0

Вы можете просто создать двумерный массив размером n x n, где n - количество элементов.

Матрица будет хранить поддержку каждой пары предметов.

Затем вы просматриваете транзакции и увеличиваете счетчик в матрице.

После завершения чтения базы данных у вас есть все элементы размера 2 и их частота в матрице.

Обратите внимание, что для эффективности обычно используется треугольная матрица.

Смежные вопросы