很久之前就像写一些关于数据挖掘算法的东西,因为懒现在才开始动手,因为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:简单逻辑实现过程中要是存在什么问题,还请各位大牛指正