主要参考了http://blog.csdn.net/sealyao/article/details/6460578中对于fp tree的介绍,fp算法的主要思路如下:
1. 扫描数据集,按照每个item出现的次数对每条记录排序(从大到小)
2. 再次扫描数据集,建立FP tree,同时把相同的item连接到“头”表中
3. 扫描“头表”,为每个item建立CPB(conditional pattern base)
4. 以CPB作为新的数据集,重复步骤2到步骤3,输出频繁项集
树结构代码如下:
package fp; import java.util.ArrayList; import java.util.List; public class TreeNode{ private String item; private TreeNode parentNode; private List<TreeNode> childNodes = new ArrayList<TreeNode>(); private int counts; private TreeNode nextNode; public String getItem() { return item; } public void setItem(String item) { this.item = item; } public TreeNode getParentNode() { return parentNode; } public void setParentNode(TreeNode parentNode) { this.parentNode = parentNode; } public List<TreeNode> getChildNodes() { return childNodes; } public void setChildNodes(List<TreeNode> childNodes) { this.childNodes = childNodes; } public int getCounts() { return counts; } public void increCounts() { this.counts = counts + 1; } public TreeNode getNextNode() { return nextNode; } public void setNextNode(TreeNode nextNode) { this.nextNode = nextNode; } public void setCounts(int counts) { this.counts = counts; } }
其他部分代码:
package fp; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class FPGrowth { private static final int MIN_SUPPORT = 3; /** * * @Title: itemSort * @Description: sort every line in itemSet according to itemMap * @param @param itemMap * @param @param imtemSet * @return void * @throws */ public void itemSort(final Map<String, Integer> itemMap, ArrayList<ArrayList<String>> imtemSet) { for(ArrayList<String> items : imtemSet) { Collections.sort(items, new Comparator<String>() { @Override public int compare(String key1, String key2) { return itemMap.get(key2) - itemMap.get(key1); } }); } } /** * * @Title: buildHeadTable * @Description: build head table for FP tree * @param @param imtemSet * @param @return * @return ArrayList<TreeNode> * @throws */ public ArrayList<TreeNode> buildHeadTable(ArrayList<ArrayList<String>> imtemSet) { ArrayList<TreeNode> head = new ArrayList<TreeNode>(); Map<String, Integer> itemMap = new HashMap<String, Integer>(); for(ArrayList<String> items : imtemSet) { for(String item : items) { if(itemMap.get(item) == null) { itemMap.put(item, 1); } else { itemMap.put(item, itemMap.get(item) + 1); } } } Iterator<String> ite = itemMap.keySet().iterator(); String key; List<String> abandonSet = new ArrayList<String>(); while(ite.hasNext()) { key = (String)ite.next(); if(itemMap.get(key) < MIN_SUPPORT) { ite.remove(); abandonSet.add(key); } else { TreeNode tn = new TreeNode(); tn.increCounts(); tn.setItem(key); tn.setCounts(itemMap.get(key)); head.add(tn); } } for(ArrayList<String> items : imtemSet) { items.removeAll(abandonSet); } itemSort(itemMap, imtemSet); Collections.sort(head, new Comparator<TreeNode>() { @Override public int compare(TreeNode key1, TreeNode key2) { return key2.getCounts() - key1.getCounts(); } }); return head; } /** * * @Title: findChildNode * @Description: find position for an item as build a FP tree * @param @param item * @param @param curNode * @param @return * @return TreeNode * @throws */ public TreeNode findChildNode(String item, TreeNode curNode) { List<TreeNode> childs = curNode.getChildNodes(); if(null != childs) { for(TreeNode tn : curNode.getChildNodes()) { if(tn.getItem().equals(item)) { return tn; } } } return null; } /** * * @Title: addAdjNode * @Description: link the nodes with the same name to the head table * @param * @return void * @throws */ public void addAdjNode(TreeNode tn, ArrayList<TreeNode> head) { TreeNode curNode = null; for(TreeNode node : head) { if(node.getItem().equals(tn.getItem())) { curNode = node; while(null != curNode.getNextNode()) { curNode = curNode.getNextNode(); } curNode.setNextNode(tn); } } } /** * * @Title: buildFPTree * @Description: build FP tree * @param @param itemSet * @param @param head * @param @return * @return TreeNode * @throws */ public TreeNode buildFPTree(ArrayList<ArrayList<String>> itemSet, ArrayList<TreeNode> head) { TreeNode root = new TreeNode(); TreeNode curNode = root; for(ArrayList<String> items : itemSet) { for(String item : items) { TreeNode tmp = findChildNode(item, curNode); if(null == tmp) { tmp = new TreeNode(); tmp.setItem(item); tmp.setParentNode(curNode); curNode.getChildNodes().add(tmp); addAdjNode(tmp, head); } curNode = tmp; tmp.increCounts(); } curNode = root; } return root; } /** * * @Title: FPAlgo * @Description: TODO * @param @param itemSet * @param @param candidatePattern * @return void * @throws */ public void FPAlgo(ArrayList<ArrayList<String>> itemSet, ArrayList<String> candidatePattern) { // build head table ArrayList<TreeNode> head = buildHeadTable(itemSet); // build FP tree TreeNode root = buildFPTree(itemSet, head); // recursion exit if(root.getChildNodes().size() == 0) { return; } // print pattern if(null != candidatePattern) { for(TreeNode tn : head) { for(String s : candidatePattern) { System.out.print(s + " "); } System.out.println(tn.getItem() + ":" + tn.getCounts()); } } for(TreeNode hd : head) { ArrayList<String> pattern = new ArrayList<String>(); pattern.add(hd.getItem()); if(null != candidatePattern) { pattern.addAll(candidatePattern); } // find conditional pattern base ArrayList<ArrayList<String>> newItemSet = new ArrayList<ArrayList<String>>(); TreeNode curNode = hd.getNextNode(); while (curNode != null) { int counter = curNode.getCounts(); ArrayList<String> parentNodes = new ArrayList<String>(); TreeNode parent = curNode; // traverse all parent nodes of curNode and put them into parentNodes while ((parent = parent.getParentNode()).getItem() != null) { parentNodes.add(parent.getItem()); } while (counter-- > 0) { newItemSet.add(parentNodes); } curNode = curNode.getNextNode(); } // recursive process FPAlgo(newItemSet, pattern); while(null != curNode) { } } } /** * * @Title: readFile * @Description: Read a file and split it into a array list * @param @param path * @param @return * @param @throws IOException * @return ArrayList<ArrayList<String>> * @throws */ public ArrayList<ArrayList<String>> readFile(String path, String separator) throws IOException { File f = new File(path); BufferedReader reader = new BufferedReader(new FileReader(f)); String str; ArrayList<ArrayList<String>> dataSet = new ArrayList<ArrayList<String>>(); while((str = reader.readLine()) != null) { if(!"".equals(str)) { ArrayList<String> tmpList = new ArrayList<String>(); String[] s = str.split(separator); for(int i = 0; i < s.length; i++) { tmpList.add(s[i]); } dataSet.add(tmpList); } } return dataSet; } public static void main(String[] args) throws IOException { FPGrowth fpg = new FPGrowth(); ArrayList<ArrayList<String>> ds = fpg.readFile("D:/fpset.txt", ","); fpg.FPAlgo(ds, null); } }
相关推荐
在Java中实现FP树算法,我们可以按照以下步骤进行: 1. **数据预处理**:首先,我们需要对原始数据进行预处理,将交易数据转换为事务ID和项ID的形式,即每条记录表示一个交易,其中包含交易中出现的所有项。 2. **...
在Java和C#中实现FPtree,我们需要考虑以下步骤: 1. **数据预处理**:首先,需要对原始数据进行预处理,包括读取事务数据、计算项的支持度,并找出频繁项集。 2. **构建FPtree**:对于每个频繁项,按照项的顺序将...
在Java中实现FPTree算法,需要创建`FPTreeNode`类来表示树的节点,包含项、计数和子节点等属性。还需要`FPTree`类来维护整个树结构,包括构建和挖掘方法。`Transaction`类可以用来表示数据库中的事务。使用Java集合...
- `FPTree`:FP-Tree类,包含根节点、插入交易和压缩树的方法。 - `Transaction`:表示单个交易,包含一组项和交易ID。 - `FrequentItemset`:用于存储频繁项集及其支持度。 - `PreprocessData`:处理原始数据,找出...
AssocRuleMining | +-- TotalSupportTree | +-- FPtree 国外一个牛人写的java 版的Fptree,供学习交流
实验中提供的源码可能是用某种编程语言(如Python、Java或C++)实现的FPTree算法。源码会涵盖上述步骤,包括数据结构的设计、函数定义、算法流程等。通过阅读和理解源码,可以深入掌握FPTree的工作原理,并能动手...
在FP-Growth算法中,FPTree(频繁模式树)是一种用于高效存储和查找频繁项集的数据结构。 **FP-Growth算法** FP-Growth是一种高效的关联规则学习算法,由Han等人于2000年提出。它的核心思想是先构建一个FP树,然后...
【标题】:“java版FPgrowth”指的是一个使用Java语言实现的FP-growth算法。FP-growth(频繁项集增长)是一种高效的数据挖掘算法,主要用于发现数据库中的频繁项集,即频繁出现在一起的项集合,常见于市场篮子分析、...
在Java中实现FP-Growth: 1. 数据结构:Java程序员需要设计合适的类来表示FP树、条件FP树以及事务等数据结构。 2. 文件读取:利用Java的I/O流读取数据文件,如www.pudn.com.txt,将其内容解析成事务列表。 3. 算法...
FP-TREE.rar 是一个压缩包,其中包含了使用Java语言实现FP-Tree算法的代码,用于挖掘数据中的频繁项集。FP-Tree(Frequent Pattern Tree)是一种数据挖掘中用于高效发现频繁项集的结构,特别是在大规模交易数据集中...
### FP-Tree算法详解及其Java源码实现 在数据挖掘领域,尤其是关联规则挖掘中,寻找频繁模式是一项核心任务。传统的Apriori算法虽然有效,但因需多次扫描数据库而存在效率瓶颈。针对这一问题,韩嘉炜教授提出的FP-...
在Java和C++实现中,这些步骤通常会封装在类或函数中,例如`FPtree`类用于表示数据结构,`FPgrowth`类用于执行挖掘过程。代码中可能会包含以下关键部分: 1. `Transaction`类:代表数据集中的一条事务,包含一组项...
在提供的Java实现中,关键类可能包括`FPNode`(表示FP树的节点)、`FPTree`(FP树的实现)和`FPGrowth`(算法的主要逻辑)。每个类都应有详细的注释,解释它们的功能和使用方法。例如,`FPNode`可能包含指向父节点的...
- `FPTree`:表示FP-Tree的数据结构,包括树节点的定义、插入方法以及遍历方法。 - `Transaction`:表示数据库中的单个交易,包含了交易项的集合。 - `Item`:表示数据中的单个项,可能包括项的ID和它的支持度信息。...
2. 从FPTree中找出所有单个频繁项对应的条件模式基(Condition Pattern Base,CPB),这些CPB实际上就是FPTree中以某个频繁项为结尾的所有路径。 3. 对每个CPB递归地执行`FPGrowth`,生成条件FPTrees,并继续找CPB,...
- `FPTree`:FP树的实现,包括插入交易、构建和遍历FP树的方法。 - `FP_growth`:核心的挖掘算法,可能包括构建FP树、剪枝、创建条件FP树和递归挖掘等功能。 - `Transaction`:表示数据库中的一笔交易,包含一组项。...
为了具体实现这个功能,我们可以创建一个`FPtree`类,包含`addTransaction`方法用于添加交易,`buildTree`方法用于构建初始树,`compressTree`方法用于压缩树,以及`mineFrequentPatterns`方法用于遍历树并挖掘频繁...
- **代码结构**:可能包括一个或多个类,分别用于数据预处理、FPTree的构建、模式挖掘以及可能的优化策略实现。 - **测试数据**:用于验证算法正确性的样本数据,可能包括不同的项集和期望的频繁项集结果。 - **测试...
- `FPTree`类:表示FP树的数据结构,包括节点和分支的表示,以及插入事务和构建树的方法。 - `FPNode`类:表示FP树中的节点,包含项、频率和指向子节点的指针。 - `Mining`类:负责实际的挖掘过程,包括构建FP树、...
FPGrowth算法在许多数据挖掘工具和库中都有实现,如Python的`mlxtend`库,Java的`Weka`框架等。这些工具提供了简单易用的接口,使得用户无需理解算法细节即可应用FPGrowth进行关联规则挖掘。 **七、性能优化** FP...