`
fighting_2013
  • 浏览: 15506 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数据挖掘笔记-关联规则-FPGrowth-1

 
阅读更多

由于Apriori算法需要多次扫描事务数据库,需要生成候选项集,大大增加了时间与空间的代价,FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,它不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对。为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树)。FP-growth算法比Apriori算法快一个数量级,在空间复杂度方面也比Apriori也有数量级级别的优化。对于海量数据,FP-growth的时空复杂度仍然很高,可以采用的改进方法包括数据库划分,数据采样等等。

 

FPGrowth算法的介绍与实例说明可以参考下面这个连接,里面讲的很详细。
http://hi.baidu.com/nefzpohtpndhovr/item/9d5c371ba2dbdc0ed1d66dca
Apriori和FP-Tree都是寻找频繁项集的算法,后面根据频繁项集产生关联规则都是一样的,就不再这里重复了。
 
FPGrowth算法Java简单实现:
public class FPGrowthBuilder {

	/** 最小支持度 */
	private int minSupport = 2;
	/** 频繁集集合*/
	private List<List<ItemSet>> frequencies = new ArrayList<List<ItemSet>>();
	
	//创建头表
	public List<FPTreeNode> buildHeadTables(Data data) {
		//统计各项出现频次
		Map<String, Integer> map = new HashMap<String, Integer>();
		for (Instance instance : data.getInstances()) {
			for (String value : instance.getValues()) {
				Integer mValue = map.get(value);
				map.put(value, null == mValue ? 1 : mValue + 1);
			}
		}
		//过滤掉未满足最小支持度的项
		List<Map.Entry<String, Integer>> entries = 
				new ArrayList<Map.Entry<String, Integer>>(); 
		for (Map.Entry<String, Integer> entry : map.entrySet()) {
			if (entry.getValue() >= minSupport) {
				entries.add(entry);
			}
		}
		//根据出现频次排序项
		Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
			public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
				return ((Integer) o2.getValue()).compareTo((Integer) o1.getValue());
			}
		});
		//数据集的过滤重排
		for (Instance instance : data.getInstances()) {
			instance.replaceValues(entries);
			ShowUtils.print(instance.getValues());
		}
		//建立头表
		List<FPTreeNode> headerTables = new ArrayList<FPTreeNode>();
		for (Map.Entry<String, Integer> entry : entries) {
			headerTables.add(new FPTreeNode(entry.getKey(), entry.getValue()));
		}
		return headerTables;
	}
	
	//创建FPGrowthTree
	public FPTreeNode buildFPGrowthTree(Data data, List<FPTreeNode> headerTables) {
		FPTreeNode rootNode = new FPTreeNode();
		for (Instance instance : data.getInstances()) {
			LinkedList<String> items = instance.getValuesList();
			FPTreeNode tempNode = rootNode;
			//如果节点已经存在则加1
			FPTreeNode childNode = tempNode.findChild(items.peek());
			while (!items.isEmpty() && null != childNode) {
				childNode.incrementCount();
				tempNode = childNode;
				items.poll();
				childNode = tempNode.findChild(items.peek());
			}
			//如果节点不存在则新增
			addNewTreeNode(tempNode, items, headerTables);
		}
		return rootNode;
	}
	
	//新增树节点
	private void addNewTreeNode(FPTreeNode parent, LinkedList<String> items, 
			List<FPTreeNode> headerTables) {
		while (items.size() > 0) {
			String item = items.poll();
			FPTreeNode child = new FPTreeNode(item, 1);
			child.setParent(parent);
			parent.addChild(child);
			//建立节点之间的关联关系
			for (FPTreeNode headerTable : headerTables) {
				if (item.equals(headerTable.getName())) {
					while (null != headerTable.getNext()) {
						headerTable = headerTable.getNext();
					}
					headerTable.setNext(child);
					break;
				}
			}
			addNewTreeNode(child, items, headerTables);
		}
	}
	
	//构建频繁项集
	public void build(Data data, List<String> postfixs) {
		List<FPTreeNode> headerTables = buildHeadTables(data);
		FPTreeNode treeNode = buildFPGrowthTree(data, headerTables);
		FPTreeNodeHelper.print(treeNode, 0);
		if (treeNode.getChildren().size() == 0) {
			return;
		}
		//收集频繁项集
		List<ItemSet> frequency = new ArrayList<ItemSet>();
		frequencies.add(frequency);
		for (FPTreeNode header : headerTables) {
			ItemSet itemSet = new ItemSet(header.getName(), header.getCount());
			if(null != postfixs){
				for (String postfix : postfixs) {
					itemSet.add(postfix);
				}
			}
			frequency.add(itemSet);
		}
		//进入下一步迭代
		for (FPTreeNode headerTable : headerTables) {
			List<String> newPostfix = new LinkedList<String>();
			newPostfix.add(headerTable.getName());
			if (null != postfixs) {
				newPostfix.addAll(postfixs);
			}
			Data newData = new Data();
			FPTreeNode startNode = headerTable.getNext();
			while (null != startNode) {
				List<String> prefixNodes = new ArrayList<String>();
				FPTreeNode parent = startNode;
				while (null != (parent = parent.getParent()).getName()) {
					prefixNodes.add(parent.getName());
				}
				int count = startNode.getCount();
				while (count-- > 0 && prefixNodes.size() > 0) {
					Instance instance = new Instance();
					instance.setValues(prefixNodes.toArray(new String[0]));
					newData.getInstances().add(instance);
				}
				startNode = startNode.getNext();
			}
			build(newData, newPostfix);
		}
	}
	
	public void print(List<List<ItemSet>> itemSetss) {
		System.out.println("Frequency Item Set");
		System.out.println(itemSetss.size());
		for (List<ItemSet> itemSets : itemSetss) {
			for (ItemSet itemSet : itemSets) {
				System.out.print(itemSet.getSupport() + "\t");
				System.out.println(itemSet.getItems());
			}
		}
	}
	
	public void build() {
		Data data = DataLoader.load("d:\\apriori.txt");
		build(data, null);
		print(frequencies);
	}
	
	public static void main(String[] args) {
		FPGrowthBuilder fpg = new FPGrowthBuilder();
		fpg.build();
	}

}

数据集格式可以参考以下数据:
1 豆奶,莴苣
2 莴苣,尿布,葡萄酒,甜菜
3 豆奶,尿布,葡萄酒,橙汁
4 莴苣,豆奶,尿布,葡萄酒
5 莴苣,豆奶,尿布,橙汁
6 莴苣,尿布,葡萄酒
结果如下:
5	[莴苣]
5	[尿布]
4	[豆奶]
4	[葡萄酒]
2	[橙汁]
4	[尿布, 莴苣]
3	[莴苣, 豆奶]
3	[尿布, 豆奶]
2	[尿布, 莴苣, 豆奶]
4	[尿布, 葡萄酒]
3	[莴苣, 葡萄酒]
2	[葡萄酒, 豆奶]
3	[尿布, 莴苣, 葡萄酒]
2	[尿布, 葡萄酒, 豆奶]
2	[橙汁, 豆奶]
2	[尿布, 橙汁]
2	[尿布, 橙汁, 豆奶]
[莴苣]------>[尿布,葡萄酒]{confidence: 0.75}
[尿布]------>[莴苣,葡萄酒]{confidence: 1.0}
[葡萄酒]------>[尿布,莴苣]{confidence: 0.75}
[尿布]------>[橙汁,豆奶]{confidence: 1.0}
[豆奶]------>[尿布,橙汁]{confidence: 1.0}
[葡萄酒]------>[尿布,豆奶]{confidence: 0.6666666666666666}
[尿布,葡萄酒]------>[莴苣]{confidence: 0.6}
[尿布]------>[莴苣,豆奶]{confidence: 0.6666666666666666}
[莴苣]------>[尿布,豆奶]{confidence: 0.6666666666666666}
[橙汁]------>[尿布,豆奶]{confidence: 0.6666666666666666}
[尿布,豆奶]------>[橙汁]{confidence: 1.0}
[莴苣,葡萄酒]------>[尿布]{confidence: 0.6}
[尿布,莴苣]------>[葡萄酒]{confidence: 0.75}
[尿布]------>[葡萄酒,豆奶]{confidence: 1.0}

 

 

 

分享到:
评论

相关推荐

    数据挖掘笔记思维导图1

    此外,关联规则分析是发现数据中频繁项集和强关联规则的过程,Apriori和FP-growth是经典的关联规则挖掘算法。 关联规则不仅用于市场预测,还可以帮助决策制定。支持度和置信度是评估关联规则强度的关键指标,频繁项...

    《数据挖掘技术》课程学习笔记

    关联规则学习,如Apriori和FP-Growth,用于找出项集之间的频繁模式,常用于市场篮子分析。回归分析则是预测连续变量的方法,如线性回归和逻辑回归。 在《数据挖掘》课程学习笔记中,还可能包含了特征选择的内容。...

    学习笔记5:数据预处理与数据挖掘十大经典算法.docx

    10. **FP-Growth**:另一种用于关联规则学习的算法,相比Apriori更加高效。 #### 四、总结 通过对数据预处理方法的详细介绍以及数据挖掘经典算法的概述,我们可以看到,数据预处理是确保数据挖掘结果准确性和有效...

    学习笔记5:大数据预处理与大数据挖掘十大经典算法.docx

    关联规则挖掘的算法包括Apriori算法、Eclat算法、FP-Growth算法等。 决策树是一种常见的分类算法,它可以用于解决分类问题。决策树的算法包括ID3算法、C4.5算法、 CART算法等。 随机森林是一种ensemble学习算法,...

    数据挖掘打印课件.7z

    建模阶段则会应用各种算法,如分类(如决策树、随机森林)、回归、聚类(如K-means、DBSCAN)和关联规则学习(如Apriori、FP-Growth)。评估阶段通过交叉验证、混淆矩阵等方法检验模型的性能和泛化能力。 在课程中...

    北邮计算机学院Python程序设计:数据挖掘类作业.zip

    4. **关联规则**:Apriori、FP-Growth等算法用于找出项集之间的频繁模式。例如,mlxtend库包含了这些算法。 五、特征工程 特征选择和特征提取是提高模型性能的关键步骤。Python的FeatureSelection模块可以帮助进行...

    基于分辨矩阵的含负属性项关联规则挖掘 (2012年)

    关联规则挖掘是数据挖掘领域中的一个重要研究方向,关联规则挖掘算法的目标是发现数据库中强关联规则,即那些具有高支持度(Support)和高置信度(Confidence)的规则,其中支持度表示规则中所有项集在所有交易中...

    物联网中的智能决策概述.pptx

    Apriori和FP-Growth是两种常见的关联规则挖掘算法,Apriori通过迭代生成频繁项集,而FP-Growth则利用压缩数据结构降低存储和计算需求。 聚类分析则是将数据分组,使同一组内的数据相似度高,组间差异大。在物联网中...

    图书馆:研究-数据挖掘

    - 关联规则学习:寻找项集之间的频繁模式,如Apriori算法和FP-Growth算法,常用于市场篮子分析。 - 回归:预测连续值,如线性回归、多项式回归和岭回归。 - 异常检测:识别数据中的异常值,常用的方法有基于统计...

    物联网导论第13章_物联网中的智能决策v1135.pptx

    关联分析的经典算法有Apriori和FP-Growth,其中FP-Growth通过构建树形结构优化了频繁项集的查找,减少了对数据库的扫描次数。 2. **聚类分析**:聚类是将相似数据分组在一起,形成不同的类别或簇。它是一种无监督...

    FP_Mining_New

    频繁模式挖掘是数据挖掘领域的一个重要组成部分,主要目标是从交易数据库或序列数据中找出频繁出现的项集或模式。这些模式可以用于市场篮子分析、关联规则学习、用户行为模式识别等多种应用场景。 在Python中,我们...

    Association-rule-for-movies

    关联规则挖掘是一种数据挖掘方法,常用于发现不同项目或事件之间的有趣关系,比如购物篮分析,找出顾客购买商品A时可能也会购买的商品B。在这个场景中,我们可能会寻找观众在观看特定电影时可能感兴趣的其他电影。 ...

    Datamining

    常见的挖掘技术有分类(如决策树、随机森林)、聚类(如K-means、DBSCAN)、关联规则(如Apriori、FP-Growth)、序列模式挖掘和回归等。 3. 模式评估与解释:找到的模式需要经过验证和解释,以确定其在业务或研究中...

    DataMiningStands

    数据挖掘算法可以分为分类(如决策树、随机森林、支持向量机)、聚类(K-Means、DBSCAN)、关联规则(Apriori、FP-Growth)、序列挖掘等。Jupyter Notebook中的代码很可能会展示如何应用这些算法。 3. **模式评估**...

    DataMining

    Apriori算法和FP-growth是典型的关联规则挖掘算法。 5. 序列和时间序列分析:在处理具有时间顺序的数据时,时间序列分析如ARIMA模型和状态空间模型可以帮助我们理解和预测未来的趋势。 6. 异常检测:数据中可能...

    机器学习常见算法思想梳理

    Apriori算法基于候选生成和检验的思想,而FPGrowth算法采用FP树的结构来挖掘频繁项集,前者适合小规模数据集,后者适合大规模数据集。 总结来说,北京邮电大学的这篇文档通过梳理各种机器学习算法的基本概念、核心...

Global site tag (gtag.js) - Google Analytics