`
czhsuccess
  • 浏览: 41771 次
社区版块
存档分类
最新评论

java实现FP tree

阅读更多

主要参考了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);
	}
}

 

分享到:
评论

相关推荐

    FP树增长算法的java实现

    在Java中实现FP树算法,我们可以按照以下步骤进行: 1. **数据预处理**:首先,我们需要对原始数据进行预处理,将交易数据转换为事务ID和项ID的形式,即每条记录表示一个交易,其中包含交易中出现的所有项。 2. **...

    FPTree 的java和C#实现

    在Java和C#中实现FPtree,我们需要考虑以下步骤: 1. **数据预处理**:首先,需要对原始数据进行预处理,包括读取事务数据、计算项的支持度,并找出频繁项集。 2. **构建FPtree**:对于每个频繁项,按照项的顺序将...

    FPTREE 构造以及挖掘算法

    在Java中实现FPTree算法,需要创建`FPTreeNode`类来表示树的节点,包含项、计数和子节点等属性。还需要`FPTree`类来维护整个树结构,包括构建和挖掘方法。`Transaction`类可以用来表示数据库中的事务。使用Java集合...

    FP-Tree-java-code

    - `FPTree`:FP-Tree类,包含根节点、插入交易和压缩树的方法。 - `Transaction`:表示单个交易,包含一组项和交易ID。 - `FrequentItemset`:用于存储频繁项集及其支持度。 - `PreprocessData`:处理原始数据,找出...

    FPtree java 开源

    AssocRuleMining | +-- TotalSupportTree | +-- FPtree 国外一个牛人写的java 版的Fptree,供学习交流

    数据挖掘FPTree实验

    实验中提供的源码可能是用某种编程语言(如Python、Java或C++)实现的FPTree算法。源码会涵盖上述步骤,包括数据结构的设计、函数定义、算法流程等。通过阅读和理解源码,可以深入掌握FPTree的工作原理,并能动手...

    fptree 关联规则

    在FP-Growth算法中,FPTree(频繁模式树)是一种用于高效存储和查找频繁项集的数据结构。 **FP-Growth算法** FP-Growth是一种高效的关联规则学习算法,由Han等人于2000年提出。它的核心思想是先构建一个FP树,然后...

    java版FPgrowth

    【标题】:“java版FPgrowth”指的是一个使用Java语言实现的FP-growth算法。FP-growth(频繁项集增长)是一种高效的数据挖掘算法,主要用于发现数据库中的频繁项集,即频繁出现在一起的项集合,常见于市场篮子分析、...

    fp.rar_FP-Growth Algorithm_fp tree_fp tree in java_fp-growth_tre

    在Java中实现FP-Growth: 1. 数据结构:Java程序员需要设计合适的类来表示FP树、条件FP树以及事务等数据结构。 2. 文件读取:利用Java的I/O流读取数据文件,如www.pudn.com.txt,将其内容解析成事务列表。 3. 算法...

    FP-TREE.rar_FP-tree java_tree_频繁项集

    FP-TREE.rar 是一个压缩包,其中包含了使用Java语言实现FP-Tree算法的代码,用于挖掘数据中的频繁项集。FP-Tree(Frequent Pattern Tree)是一种数据挖掘中用于高效发现频繁项集的结构,特别是在大规模交易数据集中...

    fp-tree java源码

    ### FP-Tree算法详解及其Java源码实现 在数据挖掘领域,尤其是关联规则挖掘中,寻找频繁模式是一项核心任务。传统的Apriori算法虽然有效,但因需多次扫描数据库而存在效率瓶颈。针对这一问题,韩嘉炜教授提出的FP-...

    数据挖掘经典代码之FP-tree合集

    在Java和C++实现中,这些步骤通常会封装在类或函数中,例如`FPtree`类用于表示数据结构,`FPgrowth`类用于执行挖掘过程。代码中可能会包含以下关键部分: 1. `Transaction`类:代表数据集中的一条事务,包含一组项...

    fpgrowth的java实现

    在提供的Java实现中,关键类可能包括`FPNode`(表示FP树的节点)、`FPTree`(FP树的实现)和`FPGrowth`(算法的主要逻辑)。每个类都应有详细的注释,解释它们的功能和使用方法。例如,`FPNode`可能包含指向父节点的...

    FP_Tree.rar_fp_fp-growth_tree

    - `FPTree`:表示FP-Tree的数据结构,包括树节点的定义、插入方法以及遍历方法。 - `Transaction`:表示数据库中的单个交易,包含了交易项的集合。 - `Item`:表示数据中的单个项,可能包括项的ID和它的支持度信息。...

    fpgrowth算法java源码

    2. 从FPTree中找出所有单个频繁项对应的条件模式基(Condition Pattern Base,CPB),这些CPB实际上就是FPTree中以某个频繁项为结尾的所有路径。 3. 对每个CPB递归地执行`FPGrowth`,生成条件FPTrees,并继续找CPB,...

    FP.zip_fp-growth java

    - `FPTree`:FP树的实现,包括插入交易、构建和遍历FP树的方法。 - `FP_growth`:核心的挖掘算法,可能包括构建FP树、剪枝、创建条件FP树和递归挖掘等功能。 - `Transaction`:表示数据库中的一笔交易,包含一组项。...

    用java语言编写的fp树

    为了具体实现这个功能,我们可以创建一个`FPtree`类,包含`addTransaction`方法用于添加交易,`buildTree`方法用于构建初始树,`compressTree`方法用于压缩树,以及`mineFrequentPatterns`方法用于遍历树并挖掘频繁...

    JAVA 版的算法

    - **代码结构**:可能包括一个或多个类,分别用于数据预处理、FPTree的构建、模式挖掘以及可能的优化策略实现。 - **测试数据**:用于验证算法正确性的样本数据,可能包括不同的项集和期望的频繁项集结果。 - **测试...

    FP-GROWTH算法的实现

    - `FPTree`类:表示FP树的数据结构,包括节点和分支的表示,以及插入事务和构建树的方法。 - `FPNode`类:表示FP树中的节点,包含项、频率和指向子节点的指针。 - `Mining`类:负责实际的挖掘过程,包括构建FP树、...

    图解FPGrowth 算法

    FPGrowth算法在许多数据挖掘工具和库中都有实现,如Python的`mlxtend`库,Java的`Weka`框架等。这些工具提供了简单易用的接口,使得用户无需理解算法细节即可应用FPGrowth进行关联规则挖掘。 **七、性能优化** FP...

Global site tag (gtag.js) - Google Analytics