`
wbj0110
  • 浏览: 1603716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用mahout fpgrowth算法求关联规则

阅读更多

 首先,这篇文章的内容大部分取自国外一篇博客Finding association rules with Mahout Frequent Pattern Mining,写这个出于几个原因,一 原文是英文的;二该博客貌似还被墙了,反正我是用了goagent才看到的;三 我简化了其实验内容,单纯的用数字表示item了。

  首先是实验环境

  • jdk >= 1.6
  • maven
  • hadoop (>1.0.0)
  • mahout >= 0.7

  环境搭建就不多说了,唯一注意的是mahout按照官网的指导绝对没问题,如果安装之后报错,可能是你的hadoop版本问题,换个hadoop试试,我遇到的错就是一直

Exception in thread "main" java.lang.NoClassDefFoundError:classpath。

  我用的数据是mahout官网上提供的retail.dat,使用哪个数据没关系,mahout fpgrowth的数据格式要求如下: 

  [item id1], [item id2], [item id3]
  0, 2, 6, ...
  0, 1, 6, ...
  4, 5, ...
  ...

  间隔符可以是别的,retail.dat里用的是空格,但要注意的是使用命令行时要标志。

  这里不设置MAHOUT_LOCAL,让mahout在hadoop上跑,所以先使用hadoop命令把数据放到hdfs上,在terminal输入:

  hadoop fs -put output.dat retail.dat

  然后输入如下指令运行mahout:

  mahout fpg -i output.dat -o patterns -k 10 -method mapreduce -regex '[\ ]' -s 10

  指令的含义在mahout的网站上有详细说明,简要说下,-i表示输入,-o表示输出,-k 10表示找出和某个item相关的前十个频繁项,-method mapreduce表示使用mapreduce来运行这个作业,-regex '[\ ]'表示每个transaction里用空白来间隔item的,-s 10表示只统计最少出现10次的项。

  成功运行后在patterns文件夹里会出现四个文件或者文件夹

  • fList: 记录了每个item出现的次数的序列文件
  • frequentpatterns: 记录了包含每个item的频繁项的序列文件
  • fpGrowth
  • parallelcounting

  当然这些结果是在hdfs上面的,可以使用mahout命令查看下这些输出,在终端输入  mahout seqdumper -i patterns/frequentpatterns/part-r-00000

  第一行显示了与item7671有关的前十个事务(按出现次数排序), ([7671],80) 表示item7671出现在80个事务中. ([39, 7671],57) 表示39和7671这两个item同时出现在57个事务里。关联规则可以由以下几个参数来推导:

  • supportsupp(X) 包含集合X的事务出现的频率:  supp(X) = \frac{number\_of\_transactions\_containing\_X}{number\_of\_transactions}
  • confidenceconf(X \Longrightarrow Y) 包含x的事务中含有同时包含Y的比例: conf(X \Longrightarrow Y) = \frac{supp(X \cup Y)}{supp(X)}
  • lift 用来表示X和Y的相互独立程度: lift(X \Longrightarrow Y) = \frac{supp(X \cup Y)}{supp(X) * supp(Y)}
  • conviction 也是用来衡量X和Y的独立性的,这个值越大越好: conv(X \Longrightarrow Y) = \frac{1 - supp(Y)}{1 - conf(X \Longrightarrow Y)}

  下面用程序来推导关联规则,先把hdfs上面的几个文件放到本地来,

  hadoop fs -getmerge patterns/frequentpatterns frequentpatterns.seq

  hadoop fs -get patterns/fList fList.seq

  代码是java代码,怎么建工程都行,我是用的eclipse+maven,因为这样它可以自动帮我下载所需要的mahout的包,把两个序列文件拷到工程的根目录下,代码如下

  

复制代码
package heyong;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.Reader;
import org.apache.hadoop.io.Text;
import org.apache.mahout.common.Pair;
import org.apache.mahout.fpm.pfpgrowth.convertors.string.TopKStringPatterns;

public class ResultReaderS {
    public static Map<Integer, Long> readFrequency(Configuration configuration, String fileName) throws Exception {
        FileSystem fs = FileSystem.get(configuration);
        Reader frequencyReader = new SequenceFile.Reader(fs,
                new Path(fileName), configuration);
        Map<Integer, Long> frequency = new HashMap<Integer, Long>();
        Text key = new Text();
        LongWritable value = new LongWritable();
        while(frequencyReader.next(key, value)) {
            frequency.put(Integer.parseInt(key.toString()), value.get());
        }
        return frequency;
    }
 
 
    public static void readFrequentPatterns(
            Configuration configuration,
            String fileName,
            int transactionCount,
            Map<Integer, Long> frequency,
            double minSupport, double minConfidence) throws Exception {
        FileSystem fs = FileSystem.get(configuration);
 
        Reader frequentPatternsReader = new SequenceFile.Reader(fs,
                new Path(fileName), configuration);
        Text key = new Text();
        TopKStringPatterns value = new TopKStringPatterns();
 
        while(frequentPatternsReader.next(key, value)) {
            long firstFrequencyItem = -1;
            String firstItemId = null;
            List<Pair<List<String>, Long>> patterns = value.getPatterns();
            int i = 0;
            for(Pair<List<String>, Long> pair: patterns) {
                List<String> itemList = pair.getFirst();
                Long occurrence = pair.getSecond();
                if (i == 0) {
                    firstFrequencyItem = occurrence;
                    firstItemId = itemList.get(0);
                } else {
                    double support = (double)occurrence / transactionCount;
                    double confidence = (double)occurrence / firstFrequencyItem;
                    if ((support > minSupport
                            && confidence > minConfidence)) {
                        List<String> listWithoutFirstItem = new ArrayList<String>();
                        for(String itemId: itemList) {
                            if (!itemId.equals(firstItemId)) {
                                
                                listWithoutFirstItem.add(itemId);
                            }
                        }
                        String firstItem = firstItemId;
                        listWithoutFirstItem.remove(firstItemId);
                        System.out.printf(
                            "%s => %s: supp=%.3f, conf=%.3f",
                            listWithoutFirstItem,
                            firstItem,
                            support,
                            confidence);
 
                        if (itemList.size() == 2) {
                            // we can easily compute the lift and the conviction for set of
                            // size 2, so do it
                            int otherItemId = -1;
                            for(String itemId: itemList) {
                                if (!itemId.equals(firstItemId)) {
                                    otherItemId = Integer.parseInt(itemId);
                                    break;
                                }
                            }
                            long otherItemOccurrence = frequency.get(otherItemId);
                            double lift = (double)occurrence / (firstFrequencyItem * otherItemOccurrence);
                            double conviction = (1.0 - (double)otherItemOccurrence / transactionCount) / (1.0 - confidence);
                            System.out.printf(
                                ", lift=%.3f, conviction=%.3f",
                                lift, conviction);
                        }
                        System.out.printf("\n");
                    }
                }
                i++;
            }
        }
        frequentPatternsReader.close();
 
    }
 
    public static void main(String args[]) throws Exception {
 
        int transactionCount = 88162;//事务总数
        String frequencyFilename = "data/fList.seq";//
        String frequentPatternsFilename = "data/frequentpatterns.seq";
        double minSupport = 0.001;//支持度
        double minConfidence = 0.3;//置信度
 
 
        Configuration configuration = new Configuration();
        Map<Integer, Long> frequency = readFrequency(configuration, frequencyFilename);
        readFrequentPatterns(configuration, frequentPatternsFilename,
                transactionCount, frequency, minSupport, minConfidence);
 
    }
}
复制代码

  程序运行得到如下的结果

[39] => 3361: supp=0.003, conf=0.565, lift=0.000, conviction=0.977
[48] => 3361: supp=0.003, conf=0.560, lift=0.000, conviction=1.186
[39, 48] => 3361: supp=0.002, conf=0.396
[48] => 337: supp=0.001, conf=0.589, lift=0.000, conviction=1.271
[39] => 337: supp=0.001, conf=0.554, lift=0.000, conviction=0.952
[48] => 338: supp=0.009, conf=0.611, lift=0.000, conviction=1.344
[39] => 338: supp=0.008, conf=0.582, lift=0.000, conviction=1.018
[39, 48] => 338: supp=0.006, conf=0.405
[48] => 340: supp=0.005, conf=0.633, lift=0.000, conviction=1.422

………………

调整支持度和置信度的值,可以增强结果的满意度。至此,完成了使用mahout fpgrowth推导规则的一次入门实验室,灵活使用这个算法,还是可以在很多地方派上用场的。

http://www.cnblogs.com/ValiancyHe/archive/2013/07/06/3174944.html

分享到:
评论

相关推荐

    mahout关联推荐算法

    PFPGrowth(并行频繁集算法)是Mahout关联推荐算法的一种实现,它是FPGrowth算法的并行版本。FPGrowth算法是对传统Apriori算法的优化,Apriori算法在处理大数据集时效率较低,因为它需要多次扫描数据以找到频繁项集...

    论文研究-FP-Growth算法的改进及在电子商务推荐中的应用 .pdf

    FP-Growth算法的改进及在电子商务推荐中的应用,张同启,张华,本文在分析mahout中并发FP-Growth关联挖掘算法源码基础上,结合B2C领域中某大型电子商务网站的实际交易数据特点和具体适配场景,对FP-Gro

    机器学习算法关联规则贝叶斯SVM、ME、kmeans、knn

    Apriori、FP-Growth等算法是关联规则挖掘的经典方法。在Java中,我们可以使用开源库如Weka或Apache Mahout进行关联规则的实现。 2. **贝叶斯方法**:基于贝叶斯定理,这种统计学方法常用于分类和预测。朴素贝叶斯...

    mahout-distribution-0.9.tar.gz

    4. **频繁项集挖掘**:通过Apriori、FP-Growth等算法发现数据集中频繁出现的项组合,常用于关联规则学习和市场篮子分析。 **三、Mahout与Hadoop的结合** Mahout充分利用了Hadoop的分布式计算能力,其大部分算法都是...

    fpg算法例子

    import org.apache.mahout.fpm.pfpgrowth.FPGrowth; import org.apache.mahout.fpm.pfpgrowth.ItemSet; public class FP_GrowthExample { public static void main(String[] args) { // 读取数据 List&lt;String&gt; ...

    mahout-0.9 jar包

    4. **频繁模式挖掘**:通过Apriori、FP-Growth等算法找出数据集中频繁出现的模式,可用于关联规则学习和购物篮分析。 5. **分布式计算**:Mahout利用Hadoop MapReduce框架实现分布式计算,能够处理PB级别的数据,...

    mahout:mahout机器智能推荐系统

    4. **频繁项集挖掘**:对于关联规则学习,Mahout实现了Apriori、FP-Growth等算法,用于发现数据集中频繁出现的项集。 ### Mahout的工作原理 Mahout利用Hadoop的MapReduce模型,将复杂的机器学习任务分解成可并行化...

    04、购物篮分析:频繁模式与频繁子项挖掘

    Apriori算法是关联规则挖掘的经典算法,它采用两步方法:首先找出所有的频繁项集,然后基于这些项集生成强关联规则。Apriori算法通过连接和剪枝操作迭代地找出频繁项集。然而,Apriori的效率受到数据规模的限制,...

    mahout 0.4版本

    Mahout 0.4包含了FPM算法,如Apriori和FP-Growth,它们可以找出在给定支持度阈值下频繁出现的项集。这些发现可以用于购物篮分析、网络日志分析等领域,帮助企业优化产品布局或预测用户行为。 在Mahout 0.4中,**...

    Java经典算法之数据挖掘

    Apriori、FP-Growth是其中的典型算法,它们在零售业中应用广泛,例如找出商品间的购买关联性,以优化商品布局和推荐系统。 集成采矿算法是将多个分类器组合以提高预测性能的方法,比如AdaBoost、Bagging(随机森林...

    JAVA数据挖掘

    - **模型构建**:应用数据挖掘算法,如分类算法(决策树、随机森林、支持向量机等)、回归算法、聚类算法(K-means、DBSCAN等)、关联规则学习(Apriori、FP-Growth等)。 - **模型评估**:使用交叉验证、ROC曲线、...

    web data ming

    关联规则挖掘(Apriori、FP-Growth)发现网页间的频繁项集;聚类分析用于将相似的网页或用户分组。 六、工具与应用 实际操作中,数据挖掘工具有如Weka、Python的Scikit-learn库、Apache Mahout等,它们提供了一系列...

    法律领域的数据挖掘

    然后是选择合适的挖掘算法,如分类(如决策树、随机森林)、聚类(如K-means、层次聚类)、关联规则(如Apriori、FP-Growth)等。这些算法可以帮助我们发现法律数据中的规律和关联。 在Java中,可以使用开源库如...

    数据挖掘_MIT全套课程

    模式发现是数据挖掘的核心部分,涵盖了多种算法和技术,如分类(例如决策树、随机森林)、聚类(K-means、层次聚类)、关联规则学习(Apriori、FP-Growth)和序列模式挖掘等。这些算法各有优缺点,适用于不同的问题...

    Practica2:数据挖掘实践2

    此外,关联规则学习(如Apriori和FP-Growth)可能也会在项目中出现,它们用于发现数据集中的项集之间的有趣关系,比如购物篮分析。在Java中,可以使用Agrima库来进行关联规则挖掘。 在实践中,我们还会涉及交叉验证...

    mineria-de-datos:由 La Salle Oaxaca 大学的学生开发的项目

    2. 数据挖掘算法:学生可能研究并实现了多种挖掘算法,如分类(决策树、随机森林)、聚类(K-means、DBSCAN)、关联规则学习(Apriori、FP-growth)或序列模式挖掘等。 3. 数据模型:为了有效地存储和处理大量数据...

Global site tag (gtag.js) - Google Analytics