我正在做一个应用程序,它将从一组事务中计算所有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中更好),这将非常有用非常感谢。
答案 0 :(得分: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%的部分。
答案 1 :(得分:1)
每次执行一笔交易。对于每笔交易,找到所有已配对的号码。将它们放在HashTable<Integer,Integer>
中,其中数字为键,值为1.如果已有条目,则递增该值。
处理完所有交易后,请浏览HashMap
并查找超过交易总数2%的值。这些是你的赢家。
它们可以直接输出到文件,也可以存储在另一个数据结构中进行排序。
答案 2 :(得分:0)
你想要做的,基本上是找到所有所有的2项目集。具有'k'元素的itemset称为k-itemset。 您的任务最简单的方法是在找到所有频繁的2项集后,修改java中的任何开源apriory实现以停止枚举项集。这并不困难,因为Apriori从计算所有1个项目集开始,然后它需要所有频繁的1项目集,使用它们生成候选2项目集,再次扫描数据库,计算对那些候选项目的支持2-项目集,选择频繁项目集,生成候选3项集等等...... 例如,假设频繁的1个项目集如下 a,c,d 然后,算法生成所有可能的2个项目集,如下所示 ac,ad,cd 通过再次扫描数据库并筛选出不常用的数据来计算其支持。
答案 3 :(得分:0)
您可以创建一个大小为n x n的二维数组,其中n是项目数。
矩阵将存储每对物品的支撑。
然后扫描事务并增加矩阵中的计数。
读完数据库后,您将所有大小为2的项目集及其频率放在矩阵中。
注意,为了提高效率,通常使用三角矩阵。