【发布时间】:2014-08-30 09:35:16
【问题描述】:
我正在尝试查找数据集中频繁项的计数。 所以最初我试图找到输入字符串的子集
Input:
coke,cracker,beer
coke,cracker
到目前为止我所做的是
String[] transaction = value.toString().split(delim);
/*
* Get subsets
*/
System.out.println("Transaction----"+Arrays.toString(transaction));
Arrays.sort(transaction);
int len = transaction.length;
long numofSubsets = (long) Math.pow(2, transaction.length);
for (long i = 1; i < numofSubsets; i++) {
String j = String.format("%" + len + "s", Long.toBinaryString(i)).replace(' ', '0');
String addVal = "";
for (int l = 0; l < j.length(); l++) {
if (j.charAt(l) == '0') {
//do nothing
}
else{
addVal += transaction[l]+delim;
System.out.println("addval---------- "+addVal);
addVal = addVal.substring(0, addVal.length()-1);
}
}
}
输出是
Transaction----[coke, cracker, beer]
addval---------- cracker
addval---------- coke
addval---------- coke
addval---------- coke,cracker
addval---------- beer
addval---------- beer
addval---------- beer,cracker
addval---------- beer
addval---------- beer,coke
addval---------- beer
addval---------- beer,coke
addval---------- beer,coke,cracker
Transaction----[coke, cracker]
addval---------- cracker
addval---------- coke
addval---------- coke
addval---------- coke,cracker
我希望子集为
coke
cracker
beer
coke,cracker
coke,beer
cracker,beer
coke
cracker
coke,cracker
Transaction----[coke, cracker]
addval---------- cracker
addval---------- coke
addval---------- coke
addval---------- coke,cracker
这里coke 是repeated。
我是不是做错了什么。
请指教。
【问题讨论】:
-
您到底在寻找什么?你想达到什么目标?
-
如果您尝试实现
APRIORI,您需要更仔细地研究该算法。它从不枚举事务的所有子集——这会在任何重要的数据集上杀死你。此外,您的代码质量还有很大的改进空间。摆脱所有Strings。 Google forsupermarket.arff并检查您是否可以处理此数据集,可以进行单元测试。 -
我在hadoop mapreduce中实现apriori。所以我认为最好的方法是传递子集并计算出现次数。然后我们将得到频繁项集。我能够得到输出。任何其他优化方式?
-
这肯定不是您现在的做法。相反,这是一种幼稚的频繁项集挖掘,因为您遗漏了 APRIORI 的所有聪明想法。估计您需要通过网络传输的数据量,以了解您的方法可扩展性如何。单个主机上的良好 APRIORI 解决方案可能比您的 Hadoop 版本扩展性更好...
-
有什么方法可以优化吗?
标签: java algorithm data-mining subset apriori