【数据挖掘】第6章 关联分析: 基本概念和算法

6 关联分析: 基本概念和算法


一、问题定义

关联分析
关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系,所发现的模式通常用关联规则或频繁项集的形式表示。
关联分析可以应用于生物信息学、医疗诊断、网页挖掘、科学数据分析等
在这里插入图片描述
频繁项集
项集:包含0个或多个项的集合 例子: {Milk, Bread, Diaper}

  • k-项集:如果一个项集包含k个项

支持度计数( σ \sigma σ):包含特定项集的事务个数。  例如: σ \sigma σ ( M i l k , B r e a d , D i a p e r ) = 2 ({Milk, Bread,Diaper}) = 2 (Milk,Bread,Diaper)=2
支持度:包含项集的事务数与总事务数的比值。  例如: s ( M i l k , B r e a d , D i a p e r ) = 2 / 5 s({Milk, Bread, Diaper}) = 2/5 s(Milk,Bread,Diaper)=2/5
频繁项集:满足最小支持度阈值( minsup)的所有项集

关联规则
关联规则是形如 X → Y X → Y XY的蕴含表达式, 其中 X 和 Y 是不相交的项集
例子: M i l k , D i a p e r → B e e r {Milk, Diaper} → {Beer} Milk,DiaperBeer

关联规则强度
支持度:确定项集的频繁程度    s ( X → Y ) = σ ( X ⋃ Y ) N s(X→Y)=\frac{\sigma(X\bigcup Y)}{N} s(XY)=Nσ(XY)
置信度:确定Y在包含X的事务中出现的频繁程度    c ( X → Y ) = σ ( X ⋃ Y ) σ ( X ) c(X→Y)=\frac{\sigma(X\bigcup Y)}{\sigma(X)} c(XY)=σ(X)σ(XY)
在这里插入图片描述

关联规则发现
关联规则发现:
给定事务的集合 T, 关联规则发现是指找出支持度大于等于 minsup并且置信度大于等于minconf的所有规则, minsup和minconf是对应的支持度和置信度阈值

关联规则发现的一种原始方法是:Brute-force approach:

  • 计算每个可能规则的支持度和置信度
  • 这种方法计算代价过高,因为可以从数据集提取的规则的数量达指数级
  • 从包含d个项的数据集提取的可能规则的总数
    R = 3 d − 2 d + 1 + 1 R=3^d-2^{d+1}+1 R=3d2d+1+1
    ,如果d等于6,则R=602

挖掘关联规则的策略
大多数关联规则挖掘算法通常采用的一种策略是,将关联规则挖掘任务分解为如下两个主要的子任务:
频繁项集产生(Frequent Itemset Generation)
其目标是发现满足最小支持度阈值的所有项集,这些项集称作频繁项集。
规则的产生(Rule Generation)
其目标是从上一步发现的频繁项集中提取所有高置信度的规则,这些规则称作强规则(strong rule)。

二、频繁项集的产生

在这里插入图片描述
暴力法→Brute-force 方法:
把格结构中每个项集作为候选项集
将每个候选项集和每个事务进行比较,确定每个候选项集的支持度计数。
在这里插入图片描述
时间复杂度 ~ O(NMw),这种方法的开销可能非常大。

降低产生频繁项集计算复杂度的方法

  • 减少候选项集的数量 (M) - 先验(apriori)原理
  • 减少比较的次数 (NM)
    替代将每个候选项集与每个事务相匹配,可以使用更高级的数据结构,或存储候选项集或压缩数据集,来减少比较次数
1)先验原理

在这里插入图片描述
先验原理:如果一个项集是频繁的,则它的所有子集一定也是频繁的
相反,如果一个项集是非频繁的,则它的所有超集也一定是非频繁的:

  • 这种基于支持度度量修剪指数搜索空间的策略称为基于支持度的剪枝(support-based pruning)
  • 这种剪枝策略依赖于支持度度量的一个关键性质,即一个项集的支持度决不会超过它的子集的支持度。这个性质也称为支持度度量的反单调性(anti-monotone)。

在这里插入图片描述

2)Apriori算法的频繁项集产生

在这里插入图片描述
在这里插入图片描述

3)候选的产生与剪枝

构造apriori-gen函数
候选项集的产生与剪枝(构造apriori-gen函数)包含2个步骤:

  • 候选项集的产生:由频繁(k-1)-项集产生新的候选k-项集
  • 候选项集的剪枝:采用基于支持度的剪枝,删除一些候选k-项集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)支持度计数

支持度计数过程确定在apriori-gen函数的候选项剪枝步骤保留下来的每个候选项集出现的频繁程度。
计算支持度的主要方法:

  • 一种方法是将每个事务与所有的候选项集进行比较,并且更新包含在事务中的候选项集的支持度计数。这种方法是计算昂贵的,尤其当事务和候选项集的数目都很大时。
  • 另一种方法是枚举每个事务所包含的项集,并且利用它们更新对应的候选项集的支持度。

在这里插入图片描述
在这里插入图片描述
存放在被访问的叶结点中的候选项集与事务进行比较,如果候选项集是该事务的子集,则增加它的支持度计数。
在该例子中 ,访问了9个叶子结点中的5个。
15个项集中的9个与事务进行比较

5)计算复杂度

支持度阈值
降低支持度阈值通常将导致更多的项集是频繁的。计算复杂度增加
随着支持度阈值的降低,频繁项集的最大长度将增加,导致算法需要扫描数据集的次数也将增多

项数
随着项数的增加,需要更多的空间来存储项的支持度计数。如果频繁项集的数目也随着数据项数增加而增长,则由于算法产生的候选项集更多,计算量和I/O开销将增加

事务数
由于Apriori算法反复扫描数据集,因此它的运行时间随着事务数增加而增加

事务的平均宽度
频繁项集的最大长度随事务平均宽度增加而增加
随着事务宽度的增加,事务中将包含更多的项集,这将增加支持度计数时Hash树的遍历次数

三、规则的产生

忽略那些前件或后件为空的规则,每个频繁k-项集能够产生多达 2 k − 2 2^k-2 2k2个关联规则
关联规则的提取:将一个项集 Y划分成两个非空的子集 X 和Y-X,使得X → Y –X满足置信度阈值。
在这里插入图片描述
这样的规则必然已经满足支持度阈值,因为它们是由频繁项集产生的。

怎样有效的从频繁项集中产生关联规则?
▪ 一般,计算关联规则的置信度并不需要再次扫描事务数据集。规则{A,B,C} → {D}的置信度为σ(ABCD)/ σ(ABC)。 因为这两个项集的支持度计数已经在频繁项集产生时得到,因此不必再扫描整个数据集
▪ 如果规则 X → Y − X X → Y-X XYX不满足置信度阈值,则形如 X ’ → Y − X ’ X’→ Y-X’ XYX的规则一定也不满足置信度阈值,其中X’是X的子集。
在这里插入图片描述


bingo~   ✨ 无论天空如何阴霾,太阳一直都在,不在这里,就在那里。

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据挖掘是一种从大量数据提取有用信息的过程。数据挖掘原理与算法第四版是一本介绍数据挖掘基本概念方法算法的书籍。其包括以下内容: 1. 数据挖掘概述 2. 数据预处理 3. 分类与预测 - 决策树分类方法 - 贝叶斯分类方法 - K-最近邻分类方法 - 集成学习方法 4. 聚类分析 5. 关联规则挖掘 6. 离群点分析 7. 数据挖掘应用 以下是一个示例,展示如何使用K-最近邻分类方法对给定数据进行分类: 引用给出了一组数据点的坐标,我们可以使用K-最近邻分类方法将这些点分为两类。具体步骤如下: 1. 将数据集分为训练集和测试集。 2. 对于测试集的每个数据点,计算它与训练集所有数据点的距离。 3. 选取距离最近的K个数据点,根据它们的类别来预测测试集数据点的类别。 4. 重复步骤2和3,直到测试集所有数据点都被分类。 下面是使用Python实现K-最近邻分类方法的示例代码: ```python from math import sqrt # 计算两个点之间的欧几里得距离 def euclidean_distance(point1, point2): distance = 0.0 for i in range(len(point1)): distance += (point1[i] - point2[i]) ** 2 return sqrt(distance) # 根据K-最近邻分类方法对数据进行分类 def k_nearest_neighbors(train, test, k): distances = [] for train_point in train: distance = euclidean_distance(train_point[:-1], test[:-1]) distances.append((train_point, distance)) distances.sort(key=lambda x: x[1]) neighbors = [distances[i][0] for i in range(k)] classes = [neighbor[-1] for neighbor in neighbors] prediction = max(set(classes), key=classes.count) return prediction # 测试K-最近邻分类方法 dataset = [[1.0, 0.0, 0], [4.0, 0.0, 0], [0.0, 1.0, 0], [1.0, 1.0, 0], [2.0, 1.0, 0], [3.0, 1.0, 1], [4.0, 1.0, 1], [5.0, 1.0, 1], [0.0, 2.0, 1], [1.0, 2.0, 1], [4.0, 2.0, 1], [1.0, 3.0, 1]] k = 3 for test_point in dataset: prediction = k_nearest_neighbors(dataset, test_point, k) print('Expected Class: %d, Predicted Class: %d' % (test_point[-1], prediction)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值