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

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

阅读更多
今天看了一下关联规则分析中的Apriori算法,先了解下基本概念:
关联规则分析用于发现隐藏在大型数据集中的有意义的联系。在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。
关联规则挖掘形式化定义:
原始数据描述

I ={i1, i2,…,im}是所有项(item)的集合,若干项的集合,称为项集(Item Sets)

T为交易(transaction,事务) t的集合,其中,交易t是项的集合,并且t⊆I

AC分别是一个I中项的集合,如果A⊆TC⊆T,且A∩C=Φ那么称交易T包含A ∪ C

目标数据描述

所有形如A⇒C蕴涵式的称为关联规则,这里A⊂I, C⊂I,并且A∩C=Φ

为了描述关联规则的有用性和确定性
•Ø关联规则的支持度
如果交易集Ts次交易包含A∪C,则称规则A=>C在事务集T上的支持度为s
Support(A=>C)=P(A∪C)
•Ø关联规则的置信度
如果交易数据库D中,包含A的交易中有c(%)的交易同时也包含C,称规则的置信度为c。(条件概率)
Confidence(A=>C)=P(C|A) =support({A} ∪{C})/support({A})
支持度, s,一次交易中包含{AC}的可能性
置信度, c,包含{A}的交易中也包含{C}的条件概率
量化后的目标
查找所有满足最小支持度和可信度的规则A=>C
 
频繁项集
如果项集满足最小支持度,则称之为频繁项集
例如A={尿布,啤酒} ,支持度=3
如果 最小支持度= 3,A是频繁项集
如果频繁项集中包含K个项,则称为频繁K-项集,A2-项集
 
关联规则的挖掘步骤
发现频繁项集
由频繁项集生成满足最小支持度和最小置信度的关联规则
 
Apriori性质
一个频繁项集中的任一非空子集也应是频繁项集。
如果一项交易包含{牛奶,面包,汽水},那么它一定包含{牛奶,面包}
{牛奶,面包,汽水}是频繁的=>{牛奶,面包}一定也是频繁的
即:任何非频繁项集的超集一定也是非频繁的
非频繁项集的超集可以不用进行测试 ,许多项之间的组合可以去掉(不满足频繁条件)
 
算法核心:逐层搜索的迭代方法,寻找最大频繁集 。
 
下面是Apriori算法Java的简单实现:
public class AprioriBuilder {
	/** 最小支持度*/
	private int minSupport = 2;
	/** 最小置信度*/
	private double minConfidence = 0.6;
	/** 数据集*/
	private Data data = null;
	/** 候选集集合*/
	private List<List<ItemSet>> candidates = null;
	/** 频繁集集合*/
	private List<List<ItemSet>> frequencies = null;
	/** 关联规则集合*/
	private Set<AssociationRule> associationRules = null;
	
	public void initialize() {
		data = DataLoader.load("d:\\apriori.txt");
		candidates = new ArrayList<List<ItemSet>>();
		frequencies = new ArrayList<List<ItemSet>>();
		associationRules = new HashSet<AssociationRule>();
	}
	
	/** 生成频繁一项集*/
	private void frequency_1_itemset_gen() {
		List<ItemSet> frequency = new ArrayList<ItemSet>();
		List<ItemSet> candidate = new ArrayList<ItemSet>();
		Map<String, Integer> map = new HashMap<String, Integer>();
		for (Instance instance : data.getInstances()) {
			Set<String> valueSet = new TreeSet<String>();
			for (String value : instance.getValues()) {
				Integer mValue = map.get(value);
				map.put(value, null == mValue ? 1 : mValue + 1);
				valueSet.add(value);
			}
		}
		ShowUtils.print(map);
		for (Map.Entry<String, Integer> entry : map.entrySet()) {
			candidate.add(new ItemSet(entry.getKey(), entry.getValue()));
			if (entry.getValue() >= minSupport) {
				frequency.add(new ItemSet(entry.getKey(), entry.getValue()));
			}
		}
		candidates.add(candidate);
		frequencies.add(frequency);
	}
	
	/** 生成频繁K项集*/
	private void frequency_k_itemset_gen(int k) {
		Iterator<ItemSet> f1Iter = frequencies.get(k - 2).iterator();
		Iterator<ItemSet> f2Iter = frequencies.get(0).iterator();
		List<ItemSet> candidate = new ArrayList<ItemSet>();
		while (f1Iter.hasNext()) {
			ItemSet item1 = f1Iter.next();
			while (f2Iter.hasNext()) {
				ItemSet item2 = f2Iter.next();
				ItemSet temp = new ItemSet();
				temp.getItems().addAll(item1.getItems());
				if (!temp.getItems().containsAll(item2.getItems())) {
					temp.getItems().addAll(item2.getItems());
					boolean isContain = false;
					for (ItemSet itemSet : candidate) {
						if (itemSet.getItems().containsAll(temp.getItems())) {
							isContain = true;
						}
					}
					if (!isContain) {
						candidate.add(temp);
					}
				}
			}
			f2Iter = frequencies.get(0).iterator();
		}
		candidates.add(candidate);
		List<ItemSet> frequency = new ArrayList<ItemSet>();
		for (ItemSet itemSet : candidate) {
			int support = calculateSupport(itemSet.getItemsArray());
			if (support >= minSupport) {
				frequency.add(itemSet);
			}
		}
		frequencies.add(frequency);
	}
	
	/** 计算项集支持度*/
	private int calculateSupport(String... items) {
		if (null == items || items.length == 0) return 0; 
		int support = 0;
		for (Instance instance : data.getInstances()) {
			int temp = 0;
			for (String value : instance.getValues()) {
				for (String item : items) {
					if (item.equals(value)) {
						temp++;
					}
				}
			}
			if (temp == items.length) {
				support++;
			}
		}
		return support;
	}
	
	/** 计算关联规则置信度*/
	private void calculateConfidence(AssociationRule associationRule) {
		String[] arLeft = associationRule.getLeft().getItemsArray();
		String[] arRight = associationRule.getRight().getItemsArray();
		int leftLength = arLeft.length;
		int rightLength = arRight.length;
		String[] left = new String[leftLength + rightLength];
		String[] right = new String[rightLength];
		System.arraycopy(arLeft, 0, left, 0, leftLength);
		System.arraycopy(arRight, 0, left, leftLength, rightLength);
		System.arraycopy(arRight, 0, right, 0, rightLength);
		double leftSup = calculateSupport(left);
		double rightSup = calculateSupport(right);
		System.out.print(AssociationRuleHelper.convert(left) + ": " + leftSup + " ");
		System.out.println(AssociationRuleHelper.convert(right) + ": " + rightSup + " ");
		if (rightSup != 0) {
			double confidence = leftSup / rightSup;
			associationRule.setConfidence(confidence);
			if (confidence >= minConfidence && !AssociationRuleHelper.isContain(
					associationRules, associationRule)) {
				associationRules.add(associationRule);
			}
		}
		for (AssociationRule child : associationRule.getChildren()) {
			calculateConfidence(child);
		}
	}
	
	/** 获取最新频繁项集*/
	private List<ItemSet> getLastFrequency() {
		int index = frequencies.size() - 1;
		List<ItemSet> frequency = frequencies.get(index);
		while (0 == frequency.size()) {
			frequency = frequencies.get((index--));
		}
		return frequency;
	}
	
	/** 生成关联规则并且计算置信度*/
	private void association_rule_gen(List<ItemSet> frequency) {
		for (ItemSet itemSet : frequency) {
			AssociationRule ar = new AssociationRule(itemSet, null);
			child_association_rule_gen(ar);
			calculateConfidence(ar);
			AssociationRuleHelper.print(ar, 0);
		}
	}
	
	/** 生成子关联规则*/
	private void child_association_rule_gen(AssociationRule associationRule) {
		ItemSet left = associationRule.getLeft();
		TreeSet<String> items = left.getItems();
		int length = items.size();
		if (length == 1) return;
		List<String> temp = new ArrayList<String>(items);
		for (int i = 0; i < length; i++) {
			AssociationRule child = new AssociationRule();
			associationRule.getChildren().add(child);
			child.getRight().addAll(associationRule.getRight().getItems());
			child.getRight().add(temp.get(i));
			for (int j = 0; j < length; j++) {
				if (j != i) {
					child.getLeft().add(temp.get(j));
				}
			}
			child_association_rule_gen(child);
		}
	}
	
	public void build() {
		initialize();
		frequency_1_itemset_gen();
		print(candidates, true);
		print(frequencies, false);
		for (int k = 2; frequencies.get(k - 2).size() > 0; k++) {
			frequency_k_itemset_gen(k);
			print(candidates, true);
			print(frequencies, false);
		}
		List<ItemSet> lastFrequency = getLastFrequency();
		print(lastFrequency);
		association_rule_gen(lastFrequency);
		System.out.println("associationRules size: " + associationRules.size());
		for (AssociationRule associationRule : associationRules) {
			AssociationRuleHelper.print(associationRule);
		}
	}
	
	public void print(List<List<ItemSet>> itemSetss, boolean isCandidate) {
		System.out.println((isCandidate ?  "Candidate" : "Frequency") + " Item Set");
		System.out.println(itemSetss.size());
		for (List<ItemSet> itemSets : itemSetss) {
			print(itemSets);
		}
	}
	
	public void print(List<ItemSet> itemSets) {
		System.out.println("----------");
		for (ItemSet itemSet : itemSets) {
			System.out.println(itemSet.getItems());
		}
		System.out.println("----------");
	}
	
	public static void main(String[] args) {
		AprioriBuilder ab = new AprioriBuilder();
		ab.build();
	}
}

 

 

分享到:
评论

相关推荐

    关联规则学习笔记

    关联规则学习是数据挖掘领域的重要方法,用于发现数据集中物品之间的有趣关系。在这个过程中,我们首先需要理解几个关键概念。 1. **频繁项集(Frequent Itemset)**:频繁项集是指在数据集中出现次数超过预设最小...

    山东大学数据挖掘期末复习笔记.pdf

    山东大学数据挖掘期末复习笔记 数据挖掘是指从大量数据中自动发现(pattern)或关系的过程。数据挖掘技术可以应用于多个领域,如商业、金融、医疗、科学研究等。在本文中,我们将对山东大学数据挖掘期末复习笔记中的...

    数据挖掘笔记思维导图1

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

    《数据挖掘概念与技术》-思维导图学习笔记,第一章。

    5. 数据挖掘技术:常见的数据挖掘技术包括决策树、贝叶斯网络、支持向量机、聚类算法如K-means和DBSCAN,以及关联规则算法如Apriori。这些技术各有优缺点,适用于不同的数据特性和问题场景。 6. 数据挖掘的应用领域...

    [浙大-数据挖掘].1-10\4.rar [浙大-数据挖掘].1-10\4.rar

    1. 数据预处理:这是数据挖掘的第一步,包括数据清洗(去除重复、错误和不完整数据)、数据集成(将来自不同源的数据合并)和数据转换(将数据转化为适合挖掘的格式)。 2. 数据探索:通过统计分析和可视化工具,...

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

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

    机器学习与数据挖掘学习笔记.zip

    《机器学习与数据挖掘学习笔记》是一份综合性的学习资料,涵盖了这两个领域的重要概念、算法和技术。这份笔记的目的是为了帮助读者深入理解机器学习和数据挖掘的基础知识,并提供实际操作的指导。 首先,我们来探讨...

    斯坦福大学CS345A 数据挖掘 课程所有课件(pdf+ppt)

    接着,课程会涉及不同的数据挖掘方法,比如分类、聚类、关联规则学习和回归。分类算法如决策树、随机森林和支持向量机,用于将数据分成不同的类别。聚类方法如K-means和层次聚类则用于无监督学习,帮助发现数据的...

    数据挖掘资料(吐血汇总).rar

    "数据挖掘笔记"这部分内容可能是学习者对所学知识的整理,包括关键概念的总结、公式解析、算法实现步骤等,对于初学者来说,这是一份极具价值的参考资料,能帮助他们更好地理解和记忆复杂的知识点。 "习题"则提供了...

    Basket-Market-ARM-:此笔记本使用关联规则挖掘在篮子市场数据集上包含ml

    关联规则挖掘是一种数据挖掘技术,用于发现数据集中物品之间的有趣关系或模式。在购物篮分析中,这种技术特别有用,因为它可以帮助零售商理解哪些商品经常一起被购买,进而优化产品布局、制定促销策略或进行推荐系统...

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

    ### 数据预处理与数据挖掘十大经典算法 #### 一、数据预处理的重要性 在数据挖掘的过程中,数据预处理是一个至关重要的环节。现实世界中的数据往往存在各种各样的问题,例如缺失值、噪声、异常值等,这些问题会...

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

    关联规则挖掘是数据挖掘中的一种常见方法,它可以用于发现数据中的关联规则。关联规则挖掘的算法包括Apriori算法、Eclat算法、FP-Growth算法等。 决策树是一种常见的分类算法,它可以用于解决分类问题。决策树的...

    数据挖掘打印课件.7z

    在这个“数据挖掘打印课件.7z”压缩包中,我们可以期待找到一系列关于数据挖掘的课程材料,可能包括PPT、PDF、笔记或者练习题,帮助我们深入理解和掌握这个领域。 首先,数据挖掘的核心目标是发现隐藏在数据中的...

    数据仓库笔记

    数据挖掘的任务涉及分类、回归、聚类、关联规则学习等,而数据挖掘方法则包括有监督学习和无监督学习。有监督学习是基于带标签的数据进行训练,无监督学习则不使用带标签的数据。 在学习算法方面,笔记中提到了各种...

    R语言笔记--常用函数、统计分析、数据类型、数据操作、帮助、安装程序包、R绘图.pdf

    R语言是一种广泛应用于统计分析、数据挖掘和数据可视化的编程语言。以下是R语言笔记的总结,涵盖了常用函数、统计分析、数据类型、数据操作、帮助和R绘图等方面的知识点。 常用函数 R语言提供了许多常用函数,例如...

    数据分析-master笔记

    接着,进入数据挖掘阶段,这里可能涉及到聚类、关联规则学习和预测建模。聚类将数据分为相似的组,如K-means、DBSCAN等算法;关联规则学习寻找项之间的频繁模式,如Apriori算法;预测建模则涵盖多种方法,如线性回归...

    中山大学数据挖掘与机器学习课件

    此外,关联规则学习,如Apriori算法,用于发现数据中的频繁项集和强关联规则,也是数据挖掘中的一个重要部分。 机器学习是数据挖掘的一个重要分支,主要研究如何通过经验改善系统的表现。在机器学习中,监督学习是...

    数据挖掘分析及其算法的应用.pdf

    Apriori算法是数据挖掘中用来发现频繁项集并生成关联规则的一个经典算法。该算法主要被应用于在大型数据集中查找数据项之间的有趣关联或频繁模式。在商业领域中,它可以帮助企业通过识别购买模式来推荐产品或服务,...

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

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

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

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

Global site tag (gtag.js) - Google Analytics