【问题标题】:How to optimize Apriori Algorithm?如何优化 Apriori 算法?
【发布时间】:2017-05-12 22:47:03
【问题描述】:

我已经在 hadoop 中使用 ma​​p-reduce 框架在数据集上实现了 apriori 算法

谁能指导我如何优化先验算法(在 hadoop map-reduce 中)?

我会很感激的。

谢谢!

编辑代码:

//MAPPER 
public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {
    Utils.count++;
    String line = value.toString();
    String[] items = line.split(" ");

    Arrays.sort( items );
    LinkedHashSet myPowerSet = powerset(items);
    for (Iterator iterator = myPowerSet.iterator(); iterator.hasNext();) {
        Object i = iterator.next();
        String _key = i.toString().replaceAll("\\[|\\]| +", "");
        context.write(new Text(_key), new IntWritable(1));
    }
}
//COMBINER
public void reduce(Text key, Iterable<IntWritable> values, Context context)
        throws IOException, InterruptedException {

    int localSum = 0;

    for (IntWritable value : values) {
        localSum += value.get();
    }
    context.write(key, new IntWritable(localSum));
}
//REDUCER
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
{
    int minSupportCount = 3;
    int supportCount = 0;

    for(IntWritable value : values) {
        supportCount += value.get();
    }
    if (supportCount >= minSupportCount) {
        context.write(key, new IntWritable(supportCount));  
    }
}

【问题讨论】:

  • 很难说如何优化你没有展示的代码。
  • 嗨,现在我已经添加了代码。请看一看。并感谢您的快速回复。

标签: algorithm hadoop mapreduce data-mining apriori


【解决方案1】:

首先:

您发布的代码不是 Apriori

缺少 Apriori 的所有重要思想。与其做这些巧妙的优化,不如做一个非常昂贵的物化,这将成倍地增加你的数据消耗。不要这样做。

避免:

  • LinkedHashSet(很慢)
  • powerset(使用 real Apriori 算法,避免了 powerset!)
  • 无类型迭代器(使用泛型)
  • 正则表达式(速度慢,尤其是未预编译时)
  • 不必要的物化(巨大的洗牌成本)
  • 重新创建IntWritable(垃圾收集成本)

首先,尝试分析您的应用程序。 还将它与 ELKI 和 SPMF 中已知的良好实现进行比较。与您的代码(在集群上)相比,您可以在这些工具中处理的最大数据集(在单核上;也可以尝试 FPgrowth)。 如果这些工具可以在单个 CPU 上处理比您的代码大 10000 倍的数据,我不会感到惊讶。

【讨论】:

    【解决方案2】:

    实际上,Apriori 是最慢的频繁项集挖掘算法之一。之后提出了许多算法,例如 Eclat、FPGrowth、H-Mine 和 LCM。其中一些可以比 Apriori 快 1000 多倍。因此,优化 Apriori 并不是真正有用,因为它存在一些基本问题。最好简单地从 Apriori 更改为另一种更快的算法,例如 LCM 或 FPGrowth。

    但在您的代码中,它似乎无论如何都不是真正的 Apriori。如果您想查看用 Java 实现的 Apriori 优化版本以及 HMine 和 FPGrowth 等更快的算法,您可以查看用 Java 实现的 SPMF 软件(我是创始人)。它是提供最多项目集和模式挖掘算法实现(超过 100 个)的软件,并且是开源的。

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 2011-04-29
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多