【问题标题】:Not getting subsets as expected没有按预期获得子集
【发布时间】: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

这里cokerepeated

我是不是做错了什么。

请指教。

【问题讨论】:

  • 您到底在寻找什么?你想达到什么目标?
  • 如果您尝试实现APRIORI,您需要更仔细地研究该算法。它从不枚举事务的所有子集——这会在任何重要的数据集上杀死你。此外,您的代码质量还有很大的改进空间。摆脱所有Strings。 Google for supermarket.arff 并检查您是否可以处理此数据集,可以进行单元测试。
  • 我在hadoop mapreduce中实现apriori。所以我认为最好的方法是传递子集并计算出现次数。然后我们将得到频繁项集。我能够得到输出。任何其他优化方式?
  • 这肯定不是您现在的做法。相反,这是一种幼稚的频繁项集挖掘,因为您遗漏了 APRIORI 的所有聪明想法。估计您需要通过网络传输的数据量,以了解您的方法可扩展性如何。单个主机上的良好 APRIORI 解决方案可能比您的 Hadoop 版本扩展性更好...
  • 有什么方法可以优化吗?

标签: java algorithm data-mining subset apriori


【解决方案1】:

这里的问题是您的println 语句的位置。由于它在生成要打印的字符串的循环内,因此它会在打印所需的字符串之前打印字符串的每个前缀。例如当你想要“可乐、饼干、啤酒”时,你会得到

coke coke, crackers coke, crackers, beer

要解决此问题,只需将您的 println 移出循环即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-10-11
    • 2021-09-19
    • 1970-01-01
    • 2021-06-25
    • 2021-11-11
    • 2018-11-12
    相关资源
    最近更新 更多