Fp关联规则算法计算置信度及MapReduce实现思路
说明:參考Mahout FP算法相关相关源代码。
算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码)
使用FP关联规则算法计算置信度基于以下的思路:
1. 首先使用原始的FP树关联规则挖掘出全部的频繁项集及其支持度;这里须要注意,这里是输出全部的频繁项集,并没有把频繁项集合并,所以须要改动FP树的相关代码,在某些步骤把全部的频繁项集输出;(ps:參考Mahout的FP树单机版的实现,进行了改动,暂不确定是否已经输出了全部频繁项集)
为举例简单,能够以以下的数据为例(原始事务集):
牛奶,鸡蛋,面包,薯片
鸡蛋,爆米花,薯片,啤酒
鸡蛋,面包,薯片
牛奶,鸡蛋,面包,爆米花,薯片,啤酒
牛奶,面包,啤酒
鸡蛋,面包,啤酒
牛奶,面包,薯片
牛奶,鸡蛋,面包,黄油,薯片
牛奶,鸡蛋,黄油,薯片
2. 得到全部的频繁项集例如以下:
0,2,3=4
2,4=3
0,1,2,3=3
3=6
2=7
1,2=5
1=7
0=7
0,3=5
0,2=6
0,1=5
4=4
0,1,2=4
0,1,3=4
1,3=5
1,4=3
上面的频繁项集中,等号后面的是支持度;每条频繁项集显示的是经过编码的,编码的规则例如以下:{薯片=0, 牛奶=3, 鸡蛋=2, 面包=1, 啤酒=4}。同一时候。能够看到上面的频繁项集中的编码是依照顺序排列的(从小到大);
计算每条频繁项集的置信度(仅仅计算2项和2项以上的频繁项集):
1) 对于频繁n项集,查找其前向(前向定义为前面n-1项集。比方频繁项集:0,2,3那么其前向为0,2)的支持度。假设频繁n项集存在。那么其前向(频繁n-1项集)必定存在(假设频繁项集是全部的频繁项集的话,这个规则一定是成立的);
2)使用n项集的支持度除以n项集的前向的支持度就可以得到n项集的置信度。
3. 依照2中的计算方法是能够计算全部的频繁项集的置信度的。可是这里有个问题:仅仅能计算比方0,2,3这个频繁项集的置信度,而不能计算0,3,2这个频繁项集的置信度(FP算法中频繁项集0,2,3和0,3,2是一样的频繁项集。可是计算置信度的时候就会不一样);
4. 针对3的问题,能够给出以下的解决方式。
// generateTopKFrequentPatterns(new TransactionIterator<A>(
// transactionStream, attributeIdMapping), attributeFrequency,
// minSupport, k, reverseMapping.size(), returnFeatures,
// new TopKPatternsOutputConverter<A>(output, reverseMapping),
// updater);
改动为以下的代码:
generateTopKFrequentPatterns(new TransactionIterator<A>(
transactionStream, attributeIdMapping), attributeFrequency,
minSupport, k, reverseMapping.size(), returnFeatures,reverseMapping
);
这种改动在FPTree里面有非常多,就不一一赘述,详情參考本文源代码下载的project;
addFrequentPatternMaxHeap(frequentPatterns);
这种方法的详细代码为:
/**
* 存储全部频繁项集
* @param patternsOut
*/
private static void addFrequentPatternMaxHeap(FrequentPatternMaxHeap patternsOut){
String[] pStr=null; // 这里的Pattern有问题。临时使用字符串解析
for(Pattern p:patternsOut.getHeap()){ pStr=p.toString().split("-");
if(pStr.length<=0){
continue;
}
// 对字符串进行下处理,这样能够降低存储
pStr[0]=pStr[0].replaceAll(" ", "");
pStr[0]=pStr[0].substring(1,pStr[0].length()-1);
if(patterns.containsKey(pStr[0])){
if(patterns.get(pStr[0])<p.support()){// 仅仅取支持度最大的
patterns.remove(pStr[0]);
patterns.put(pStr[0], p.support());
}
}else{
patterns.put(pStr[0], p.support());
}
} }
这里假定这种操作能够得到全部的频繁项集。而且存入到了patterns静态map变量中。
/**
* 依据排序频繁相机支持度 生成多频繁项集支持度
*/
public void generateFatPatterns(){
int[] patternInts=null;
for(String p :patterns.keySet()){
patternInts = getIntsFromPattern(p);
if(patternInts.length==1){// 针对频繁一项集
fatPatterns.put(String.valueOf(patternInts[0]), patterns.get(p));
}else{
putInts2FatPatterns(patternInts,patterns.get(p));
} }
} /**
* 把数组中的每一项作为后向进行输出,加入到fatpatterns中
* @param patternInts
* @param support
*/
private void putInts2FatPatterns(int[] patternInts, Long support) {
// TODO Auto-generated method stub
String patternStr =Ints2Str(patternInts);
fatPatterns.put(patternStr, support);// 处理最后一个后向
for(int i=0;i<patternInts.length-1;i++){// 最后一个后向在前面已经处理
// 不能使用同一个数组
patternStr=Ints2Str(swap(patternInts,i,patternInts.length-1));
fatPatterns.put(patternStr, support);
} }
4. 针对上面输出的频发项集进行置信度的计算:
public void savePatterns(String output,Map<String,Long> map){
// 清空patternsMap
patternsMap.clear();
String preItem=null;
for(String p:map.keySet()){
// 单项没有前向。不用找
if(p.lastIndexOf(",")==-1){
continue;
}
// 找出前向
preItem = p.substring(0, p.lastIndexOf(","));
if(map.containsKey(preItem)){
// patterns.get(p) 支持度,patterns.get(preItem)前向支持度
patternsMap.put(p, map.get(p)*1.0/map.get(preItem));
}
}
FPTreeDriver.createFile(patternsMap, output);
}
因为把频繁项集和支持度都放入了Map中,所以这样计算比較简单。
这里能够使用MapReduce的思路来实现。
1. 把文件A复制一份得到文件B;
对A的处理为直接输出频繁项集,输出的key为频繁项集,value是支持度和A的标签;对B的处理为输出全部的频繁项集中项大于1的频繁项集,其输出的key是频繁项集的前向(定义为频繁项集前面n-1个项)。value是频繁项集的后向(后向定义为频繁项集的最后一项)和支持度和标签。
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990
Fp关联规则算法计算置信度及MapReduce实现思路的更多相关文章
- 关联规则算法之FP growth算法
FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...
- 机器学习(十五)— Apriori算法、FP Growth算法
1.Apriori算法 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策. Apriori算法采用了迭代的方法,先搜 ...
- 关联规则算法Apriori的学习与实现
转自关联规则算法Apriori的学习与实现 首先我们来看,什么是规则?规则形如"如果-那么-(If-Then-)",前者为条件,后者为结果.关联规则挖掘用于寻找给定数据集中项之间的 ...
- Frequent Pattern (FP Growth算法)
FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达 到这样的效果,它采用了一种简洁的数据 ...
- FP—Growth算法
FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录, ...
- HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据
本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载. 前篇<HotSpot关联规则算法(1)-- 挖掘离散型数据>分析了离 ...
- Frequent Pattern 挖掘之二(FP Growth算法)
Frequent Pattern 挖掘之二(FP Growth算法) FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断 ...
- 大数据计算的基石——MapReduce
MapReduce Google File System提供了大数据存储的方案,这也为后来HDFS提供了理论依据,但是在大数据存储之上的大数据计算则不得不提到MapReduce. 虽然现在通过框架的不 ...
- FP增长算法
Apriori原理:如果某个项集是频繁的,那么它的所有子集都是频繁的. Apriori算法: 1 输入支持度阈值t和数据集 2 生成含有K个元素的项集的候选集(K初始为1) 3 对候选集每个项集,判断 ...
随机推荐
- JetBrains系列产品激活
注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址: http://idea.codebeta.cn https://s.tuzhi ...
- onPullDownRefresh函数没有被正确执行
原因 问题原因很多,我遇到的这个问题的原因是: 页面有两个同名的onPullDownRefresh函数,导致只执行最后的一个. 解决 只留一个onPullDownRefresh函数
- VR技术在数据中心3D机房中的应用 (下)
VR技术在数据中心3D机房中的应用 (下) 前面给大家简单科普了一下VR的硬件设备以及VR在各个领域的应用,是不是觉得非常高大上?千言万语概括成一句话,VR能给用户带来前所未有的沉浸感和交互方式,让人 ...
- JAVA用freemarker生成复杂Excel。(freemarker)
在生成Excel的时候,大多时候都是使用poi,jxl等进行的,但是对于复杂的Excel来说,这个工作量是非常的大的,而且,对于我这么懒的人来说,这是相当痛苦的一件事情,所以,我不得不找找有没有简单一 ...
- luogu 1968 美元汇率
https://www.luogu.org/problemnew/show/P1968 定义二维数组f[ ][ ],f[i][1]表示在第i天将马克变为美元,f[i][2]表示在第i天将美元变为马克. ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
- [LUOGU] P2920 [USACO08NOV]时间管理Time Management
见7.3测试 #include<iostream> #include<algorithm> #include<cstdio> using namespace std ...
- Linux组和提权
目 录 第1章 组命名管理** 1 1.1 group组信息和密码信息 1 1.1.1 /etc/group 组账户信息 1 1.1.2 /etc/gshadow 组密码信息 ...
- 小而美的Promise库——promiz源码浅析
背景 在上一篇博客[[译]前端基础知识储备--Promise/A+规范](https://segmentfault.com/a/11...,我们介绍了Promise/A+规范的具体条目.在本文中,我们 ...
- Android开发——程序锁的实现(可用于开发钓鱼登录界面)
1. 程序锁原理 1.1 实现效果: 在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用.若不输入直接按返回键,则直接返回 ...