spark机器学习实现之fpgrowth

本文介绍了FPGrowth算法在Spark MLlib中的应用实践,包括设置参数、数据预处理、运行算法及结果展示等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久之前就像写一些关于数据挖掘算法的东西,因为懒现在才开始动手,因为fpgrowth算法在mlib中的实现
相对比较简单,所以打算先拿它下手。
关于fpgrowth的原理本人说的也不专业, 推荐

http://blog.youkuaiyun.com/huagong_adu/article/details/17739247

这里主要写一下在mlib当中,实现的一个过程
先上代码

Logger.getLogger("org").setLevel(Level.ERROR)
    conf.setAppName("fpgrowth")
    //设置参数
    //最小支持度
    val minSupport = 0.1
    //最小置信度
    val minConfidence = 0.8
    //数据分区
    val numPartitions = 2

之前定义好了一个类,里边对conf的基础设置做了定义,直接继承,然后配置appname
1.设置好支持度和置信度阀值
2.设置好数据的分区

 val data = sc.textFile("/usr/local/soft/data/fpgrowth.csv")
    //把数据通过空格分割
    val transactions = data.map(x => x.split(","))
    transactions.cache()

取数,我为了快速实现,还是把数据放到了数据文件里边了,在数据量比较大的情况下,还是
推荐hive或者hdfs上去存放数据。

3567,3577,3645,3653
17805
3665,3669
13341,16617,16661,17291,17535,17549,17553,17921,17931,18205,18225,3467,3567,3699,3771,3785,3943,3959,3981,4019,8623,8635,8651,8657,8663
12369,12371,12585,12587,12589,12593,12597,12605,2188,4335,6597

以上是部分数据展现,记录的是用户的浏览情况

//创建一个FPGrowth的算法实列
    val fpg = new FPGrowth()
    //设置训练时候的最小支持度和数据分区
    fpg.setMinSupport(minSupport)
    fpg.setNumPartitions(numPartitions)

创建实例并且设置分区和支持度阀值

 //把数据带入算法中
    val model = fpg.run(transactions)

跑算法,这里其实才是整段的核心部分,返回类型是FPGrowthModel[String],关于这个类型,
如果有时间我们再来仔细的说一说

//查看所有的频繁项集,并且列出它出现的次数
    model.freqItemsets.collect().foreach(itemset => {
      println(itemset.items.mkString("[", ",", "]") + "," + itemset.freq)
    })

如果不放心可以看看自己的频繁项集都是什么样子的

val Arrayrec = new ArrayBuffer[String];
    model.generateAssociationRules(minConfidence).collect().foreach(rule => {
      if (rule.antecedent.length.==(1)) {
        println(rule.antecedent.mkString + "-->" +
          rule.consequent.mkString + "-->" + rule.confidence)
        val rec = rule.antecedent.mkString + "," + rule.consequent.mkString+","+rule.confidence

        Arrayrec += rec
      }
    })

可以打印出来看看,其中的关联规则都是怎么样子的。antecedent表示前项,consequent表示后项,
,confidence表示规则的置信度。

12539-->13345-->1.0
12539-->12551-->1.0
12539-->13705-->1.0
12539-->13695-->1.0
12539-->12533-->1.0
12539-->13697-->1.0
12539-->12535-->1.0

大概的规则就是这样了,因为我自己的需要,我选择了前项是1的。
数据还是要存储的,写个函数存到mysql里边,就可以之前前台查询了

 def writeRecResultToMysql(uid: ArrayBuffer[String], sqlContext: SQLContext, sc: SparkContext) {
      //val uidString = uid.map(x => x.split(",")(0).toString() + "," + x.split(",")(1).toString())
      import sqlContext.implicits._
      val uidDFArray = sc.parallelize(uid)
      val uidDF = uidDFArray.map(x => x.split(",")).map(x => FpgrowthResult(x(0).trim().toInt, x(1).trim.toInt,x(2).trim().toDouble)).toDF
      uidDF.write.mode(SaveMode.Append).jdbc(jdbcURL, recResultTable_fpGrowth, prop)

    }

要是还想看看规则生成了多少条,也可以打印一下

    println(model.generateAssociationRules(minConfidence).collect().length)

好了,至此简单的逻辑应该没什么问题了。
ps:简单逻辑实现过程中要是存在什么问题,还请各位大牛指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值