目录java
@(hadoop)[Spark, MLlib, 数据挖掘, 关联规则, 算法]node
经典的关联规则挖掘算法包括Apriori算法和FP-growth算法。Apriori算法屡次扫描交易数据库,每次利用候选频繁集产生频繁集;而FP-growth则利用树形结构,无需产生候选频繁集而是直接获得频繁集,大大减小扫描交易数据库的次数,从而提升了算法的效率。可是apriori的算法扩展性较好,能够用于并行计算等领域。算法
关联规则的目的就是在一个数据集中找出项与项之间的关系,适用于在大数量的项集中发现关联共现的项。也被称为购物篮分析 (Market Basket analysis),由于“购物篮分析”很贴切的表达了适用该算法情景中的一个子集。sql
购物网站里你买了一个商品,旁边列出一系列买过该商品的人还买的其余商品,而且按置信度高低排序,通常会发现买手机的还会买充电器(买充电器的人不必定会买手机),买牙刷的还会买牙膏,这大概就是关联规则的用处。数据库
基础环境:
CentOS-6.5
JDK-1.7
spark:spark-1.2.0+cdh5.3.6+379数据结构
支持度(Support):定义为
$$supp(X) = \frac{包含X的记录数}{数据集记录总数}= P(X)=\frac{occur(X)}{count(D)}$$
置信度(Confidence): 定义为
$$ conf(X=>Y) = \frac{同时包含X和Y的记录数}{数据集中包含X的记录数}=P(Y|X)=\frac{P(X \cap Y)}{P(X)} = \frac{occur(X \cap Y)}{occur(X)}$$
FP-growth算法是Apriori算法的优化。ide
spark-1.2.0 版本中Mliib的FPGrowthModel并无generateAssociationRules(minConfidence)方法。所以要引用高版本的jar包,并在提交任务时指定才行。这是能够实现的。oop
下面共选取了6931条购买历史记录,做为关联规则挖掘的数据集。优化
咱们可能须要使用类Mysql中的group_concat()
来产生源数据。在Hive中的替代方案是concat_ws()
。但若要链接的列是非string型,会报如下错误:Argument 2 of function CONCAT_WS must be "string or array<string>", but "array<bigint>" was found.
。使用如下hiveSQL能够避免此问题:网站
SELECT concat_ws(',', collect_set(cast(item_id AS String))) AS items FROM ods_angel_useritem tb GROUP BY tb.user_id;
获得item1,item2,item3
式数据结构。
数据结构以下所示:
731478,732986,733494 731353 732985,733487,730924 731138,731169 733850,733447 731509,730796,733487 731169,730924,731353 730900 733494,730900,731509 732991,732985,730796,731246,733850
JavaRDD<List<String>> transactions = ...;
Java代码:
//设置频率(支持率)下限 FPGrowth fpg = new FPGrowth().setMinSupport(0.03).setNumPartitions(10); FPGrowthModel<String> model = fpg.run(transactions); List<FPGrowth.FreqItemset<String>> list_freqItem = model.freqItemsets().toJavaRDD().collect(); System.out.println("list_freqItem .size: " + list_freqItem .size()); for (FPGrowth.FreqItemset<String> itemset : list_freqItem) { System.out.println("[" + itemset.javaItems() + "], " + itemset.freq()); }
结果:
[[734902]], 275 [[733480]], 1051 [[734385]], 268 [[733151]], 895 [[733850]], 878 [[733850, 733480]], 339 [[733152]], 266 [[733230]], 243 [[731246]], 500 [[731246, 733480]], 233 [[734888]], 231 [[734894]], 483 [[733487]], 467 [[740697]], 222 [[733831]], 221 [[734900]], 333 [[731353]], 220 [[731169]], 311 [[730924]], 308 [[732985]], 212 [[732994]], 208 [[730900]], 291
$$\frac{208}{6931}=0.03001>0.03$$,6931是交易的订单数量,即数据源总条数。
可见,商品732994正好高于支持率下限。
Java代码:
double minConfidence = 0.3; //置信下限 List<AssociationRules.Rule<String>> list_rule = model.generateAssociationRules(minConfidence).toJavaRDD().collect(); System.out.println("list_rule.size: " + list_rule.size()); for (AssociationRules.Rule<String> rule : list_rule) { System.out.println( rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence()); }
结果:
[733480] => [733850], 0.3225499524262607 [731246] => [733480], 0.466 [733850] => [733480], 0.38610478359908884
以上代表,用户在购买商品733480后每每还会购买商品733480,可信度为0.3225499524262607;用户在购买商品731246后每每还会购买商品731246,可信度为0.466;用户在购买商品733850后每每还会购买商品733480,可信度为0.38610478359908884。
spark-submit --master spark://node190:7077 --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar
spark-submit --master yarn-client --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar
在实际状况中,真实的业务数据到处都是噪声。活用数据,设计有业务含义的特征体系,是构造鲁棒模型的基础!
具体的解决办法,咱们能够多算法并用,这些将在后续的aitanjupt文章中详述。
也就是说,“购买了该宝贝的人32%还购买了某某商品”就是使用商品关联规则挖掘实现的;还有一些捆绑销售,例如牙膏和牙刷一块儿卖,尿布和啤酒放在一块儿卖。
关联规则挖掘算法不仅是能用在商品销售,使用它咱们能够挖掘出更多的关联关系,好比咱们能够挖掘出,温度、天气、性别等等与心情之间是否有关联关系,这是很是有意义的。
关联规则挖掘算法应用场景很是庞大,遥记多年前作的手机用户关联分析,那时还没有用到关联规则挖掘算法,用的是本身编写的类join算法,如今看起来,关联规则挖掘算法是再适合不过的了。
上面是mllib下全部的算法。
某一数据挖掘算法能够作某种特定的分析,也能够跨界使用,还能够联合应用,重要的是理解其思想以灵活运用。
幸福是有一颗感恩的心,健康的身体,趁心的工做,一位深爱你的人,一帮信赖的朋友!
祝你们小年快乐!
做者 @王安琪
http://www.cnblogs.com/wgp13x/ 2016 年 02月 02日