首页 > 编程语言 >从0开始机器学习--11.关联规则挖掘基础(概念-频繁项集、关联规则、支持度置信度提升度,经典算法-Apriori、哈希树优化支持计数,关联模式评估与复杂度分析,应用与未来趋势,含代码)

从0开始机器学习--11.关联规则挖掘基础(概念-频繁项集、关联规则、支持度置信度提升度,经典算法-Apriori、哈希树优化支持计数,关联模式评估与复杂度分析,应用与未来趋势,含代码)

时间:2024-11-19 09:45:56浏览次数:3  
标签:置信度 支持 项集 频繁 规则 关联

写在前面

“关联规则挖掘”是数据挖掘的一个重要方向。在本专栏之前的所有文章中,我们已经了解了机器学习和神经网络的基本模型、数据分析方面的应用。那这篇文章所介绍的就是在数据分析方面的另一种“关联规则”的挖掘。本博文是我个人根据ppt的学习记录稍加整理和理解,若有疑问或有误欢迎指出交流!

  1. python基础;
  2. ai模型概念+基础;
  3. 数据预处理;
  4. 机器学习模型--1.聚类;2.降维;3.回归(预测);4.分类;
  5. 正则化技术;
  6. 神经网络模型--1.概念+基础;2.几种常见的神经网络模型;
  7. 对回归、分类模型的评价方式;
  8. 简单强化学习概念;
  9. 几种常见的启发式算法及应用场景;
  10. 机器学习延申应用-数据分析相关内容--1.A/B Test;2.辛普森悖论;3.蒙特卡洛模拟;
  11. 数据挖掘--关联规则挖掘

以及其他的与人工智能相关的学习经历,如数据挖掘、计算机视觉-OCR光学字符识别等。


目录

写在前面

关联规则挖掘简介

应用场景

关键概念解析

在关联规则挖掘中的超集

极大频繁项集v.s.闭项集​编辑

经典算法

Apriori算法

关联规则生成

使用哈希树优化支持计数

高级算法与优化

关联模式的评估方法

复杂度分析

挑战与前沿方向

数据挖掘的未来趋势

总结


关联规则挖掘简介

随着信息化时代的到来,数据已经成为最重要的资源之一。如何从海量数据中提取有价值的信息成为一大挑战。关联规则挖掘(Association Rule Mining)是数据挖掘的一种重要技术,用于发现数据中隐含的关系和模式。

应用场景

  • 零售行业:分析购物篮数据,揭示商品购买之间的潜在关联。在零售中,分析商品间的购买模式(如{Milk, Diaper} → {Beer})可以用于优化商品陈列和促销策略。
  • 网络安全:通过分析访问日志挖掘异常模式。关联规则用于分析日志数据,挖掘潜在的攻击模式,如{登录失败,异常IP} → {账户锁定}。
  • 医疗诊断:关联患者症状与疾病,帮助医生制定治疗方案。
  • 推荐系统:根据用户行为挖掘偏好模式,用于个性化推荐。例如“喜欢A的人可能也喜欢B”。

关键概念解析

(1) 项集、频繁项集和关联规则

  • 项集:一组物品的集合。例如,超市中的一笔购买记录可以看作一个项集:{牛奶, 面包, 鸡蛋}。
  • 频繁项集:满足最小支持度阈值的项集。例如,如果项集{牛奶, 面包}出现在60%的交易记录中,且支持度阈值为50%,则该项集是频繁的。
  • 关联规则:形如X → Y的语义表达式,表示“如果购买了X,则很可能购买Y”。

(2) 支持度、置信度与提升度

  • 支持度(Support):衡量规则覆盖的事务比例。表示项集出现在所有事务中的比例。s(X)=包含X的事务数​/总事务数。​
  • 置信度(Confidence):规则的可靠性。即在包含X的事务中同时包含Y的概率。c(X→Y)=s(X∪Y)​/s(X)
  • 提升度(Lift):衡量规则的独立性。提升度越高,关联性越强。l(X→Y)=c(X→Y)​/s(Y)

(3) 极大频繁项集与闭项集

  • 极大频繁项集:频繁项集的超集不是频繁的。
  • 闭项集:若一个频繁项集X的直接超集都不具有和它相同的支持度计数,则它是闭项集

超集是数学集合论中的一个概念。如果一个集合 A 包含另一个集合 B 的所有元素,并且 AAA 可以包含 BBB 之外的其他元素,那么 AAA 被称为 BBB 的超集(Superset)。用符号表示为:

A \supseteq B 表示 B 是 A 的子集,或者说 A 是 B 的超集。

如果 A 包含 B 的所有元素,但 A 至少有一个 B 中不存在的元素,则称 A 是 B 的真超集,记为:

A \supset B 

# 定义集合
A = {1, 2, 3, 4}
B = {1, 2}

# 判断超集关系
is_superset = A.issuperset(B)  # True
is_proper_superset = A > B     # True, 真超集

# 输出结果
print(f"A 是 B 的超集: {is_superset}")
print(f"A 是 B 的真超集: {is_proper_superset}")

在关联规则挖掘中的超集

在关联规则挖掘中,频繁项集的超集指的是包含某频繁项集的所有项集。例如:给定 B={Milk,Bread},A={Milk,Bread,Diaper}是 B 的超集。

频繁项集的性质

  • 反单调性(Apriori性质):如果一个项集 A 不是频繁的,则它的所有超集 A′⊃A也不可能是频繁的。这一性质用于减少算法中的计算开销。

超集在剪枝中的应用

在 Apriori 算法中,生成候选项集后,需要检查哪些候选项集不符合支持度条件。如果某项集不是频繁的,其所有超集也会被直接剪掉,从而避免不必要的计算。

极大频繁项集v.s.闭项集

代码示例:

以下代码通过Python模拟一个购物篮数据集,并计算指定规则的支持度、置信度与提升度:

import pandas as pd

# 模拟事务数据
data = {
    'TID': [1, 2, 3, 4, 5],
    'Items': [
        {'Milk', 'Bread', 'Diaper'},
        {'Bread', 'Diaper', 'Beer', 'Eggs'},
        {'Milk', 'Diaper', 'Beer', 'Coke'},
        {'Bread', 'Milk', 'Diaper', 'Beer'},
        {'Bread', 'Milk', 'Diaper', 'Coke'}
    ]
}
df = pd.DataFrame(data)

# 计算支持度
def calculate_support(itemset, df):
    total_transactions = len(df)
    count = sum(itemset <= row for row in df['Items'])
    return count / total_transactions

# 计算置信度
def calculate_confidence(X, Y, df):
    support_X = calculate_support(X, df)
    support_XY = calculate_support(X | Y, df)
    return support_XY / support_X

# 计算提升度
def calculate_lift(X, Y, df):
    confidence = calculate_confidence(X, Y, df)
    support_Y = calculate_support(Y, df)
    return confidence / support_Y

# 规则 {Milk} -> {Diaper}
X = {'Milk'}
Y = {'Diaper'}
support = calculate_support(X | Y, df)
confidence = calculate_confidence(X, Y, df)
lift = calculate_lift(X, Y, df)

print(f"支持度: {support:.2f}")
print(f"置信度: {confidence:.2f}")
print(f"提升度: {lift:.2f}")

运行结果:

支持度: 0.60
置信度: 1.00
提升度: 1.25
  • 支持度表明规则覆盖了60%的事务。
  • 置信度表示在购买牛奶的事务中,100%也包含尿布。
  • 提升度>1,说明购买牛奶与购买尿布之间有正关联。

经典算法

Apriori算法

Apriori算法基于反单调性原理,通过逐层生成候选项集并剪枝,找到频繁项集。

算法步骤

  1. 从所有1项集开始,计算支持度,筛选出频繁1项集。
  2. 利用频繁(k-1)项集生成候选k项集。
  3. 剪枝:剔除包含非频繁子集的候选项集。
  4. 扫描数据库,计算支持度并生成频繁k项集。
  5. 重复以上步骤,直到没有新的频繁项集生成。

from itertools import combinations

# Apriori算法核心函数
def apriori(df, min_support):
    transactions = df['Items'].tolist()
    total_transactions = len(transactions)
    
    # 计算支持度
    def get_support(itemset):
        count = sum(itemset <= t for t in transactions)
        return count / total_transactions
    
    # 初始频繁1项集
    single_items = {frozenset([item]) for transaction in transactions for item in transaction}
    frequent_itemsets = {item: get_support(item) for item in single_items if get_support(item) >= min_support}
    
    # 迭代生成频繁项集
    k = 2
    while frequent_itemsets:
        print(f"频繁{k-1}项集: {frequent_itemsets}")
        # 生成候选k项集
        candidate_k = {i | j for i in frequent_itemsets for j in frequent_itemsets if len(i | j) == k}
        # 计算支持度
        frequent_itemsets = {item: get_support(item) for item in candidate_k if get_support(item) >= min_support}
        k += 1


apriori(df, min_support=0.4)

后续还可以通过将频繁项集大小与支持度绘制成折线图,可以观察支持度阈值对频繁项集的影响。

关联规则生成

从频繁项集中生成关联规则的核心是枚举每个项集的非空子集并计算置信度。若置信度满足最小阈值,则保留该规则。

基于Apriori的规则生成:

使用哈希树优化支持计数

哈希树通过将候选项集映射到哈希桶中,大幅减少比较次数。事务只需与同一哈希桶中的候选项集进行匹配,极大提高了效率。

高级算法与优化

FP-Growth算法:FP-Growth通过构建频繁模式树避免了多次数据库扫描,适合大数据集。

模式压缩:通过极大频繁项集与闭项集的压缩表示,减少存储开销。

关联模式的评估方法

关联规则挖掘生成大量规则,需要进一步量化评估。除支持度和置信度外,以下度量指标也常被使用:

  • 兴趣度(Interest)

    I(X \to Y) = \frac{P(Y|X)}{P(Y)}

    表示X和Y之间的关联强度。

  • PS度量

    PS = P(X \cap Y) - P(X)P(Y)

    衡量规则的非独立性。

  • f相关系数: 用于度量规则的线性相关性。

局限性

  • 支持度和置信度未考虑随机性影响。
  • 仅依赖这些指标可能导致虚假模式的产生,如“高支持度的项集总是关联”的错觉。(即辛普森悖论,在本专栏《10》中有具体介绍)

性质

  • 对称性
    • 对称的度量:支持度、兴趣因子/提升度、 f相关度、PS、余弦相似度、Jaccard系统等
    • 不对称的度量:置信度、互信息、基尼指数等
  • 缩放性
  • 反演性
  • 零加性:对所有对象进行零加操作,度量值不变
    • 具有零加性的度量: 支持度、余弦相似度、Jaccrad系数等
    • 不具有零加性的度量:f相关度、兴趣因子等

复杂度分析

关联规则挖掘的计算复杂度主要受到以下因素影响:

  1. 事务数目和维度:事务数目越多,维度越高,算法的计算量越大。
  2. 支持度阈值:较低的支持度阈值会生成更多频繁项集,导致复杂度增加。
  3. 数据稀疏性:稠密数据集中的项集组合更为复杂。

优化方向

  • 采用压缩表示法,如极大频繁项集或闭项集。
  • 使用分布式计算框架,如MapReduce。

挑战与前沿方向

(1) 倾斜支持度分布

在大数据集中,大多数项的支持度很低,而少数项的支持度很高(倾斜支持度。这种分布导致规则挖掘面临以下问题:

  • 高支持度项可能掩盖低支持度项的模式。
  • 低支持度阈值增加计算量。

解决方案:

  • 引入H置信度(全置信度)指标,以避免虚假模式。
  • 识别并处理交叉支持模式。

(2) 高维数据挖掘 随着数据维度的增加,事务之间的重叠减少,导致频繁项集稀疏。研究重点在于开发更加高效的算法,如FP-Growth。

数据挖掘的未来趋势

随着数据规模和复杂度的不断增加,关联规则挖掘的研究正朝以下方向发展:

  1. 深度学习结合挖掘:利用深度学习模型增强规则的生成与筛选。
  2. 实时模式挖掘:实现对流数据的实时挖掘。
  3. 隐私保护数据挖掘:开发保证用户隐私的关联规则挖掘方法。

关联规则挖掘的意义不仅在于模式发现,更在于为商业决策和科学研究提供数据支撑。未来,随着技术的进步和算法的优化,其应用范围将更加广泛。


总结

关联规则挖掘是信息化时代挖掘数据价值的重要工具,通过分析数据中的潜在模式,为实际问题提供解决方案。在算法层面,Apriori通过反单调性实现剪枝,FP-Growth利用频繁模式树大幅提高效率;在性能优化上,压缩表示和分布式计算成为突破复杂度的关键。在评估模式时,综合多维度量化指标,避免偏差或虚假关联。此外,面对倾斜支持度分布、高维数据等挑战,研究人员提出了多种创新方案,如引入H置信度和开发高效算法。未来,深度学习、实时挖掘和隐私保护技术将进一步扩展关联规则挖掘的应用场景,为解决复杂数据问题提供更强有力的支持。

标签:置信度,支持,项集,频繁,规则,关联
From: https://blog.csdn.net/m0_73752612/article/details/143841369

相关文章

  • Express的使用笔记8 引入验证中间件来给表单添加验证规则~
    前面已经将数据成功写入了数据库了,接下来就开始探讨接口传递参数的校验咯~自己封装虽然灵活,但也常常架不住有现成的,既灵活又方便,比如:express-valiation官方文档地址:https://express-validator.github.io/docs/guides/schema-validation先安装咯!npmiexpress-valiation引入......
  • git提交提示本地分支 '(no branch)' (远程分支 = '(no branch)') 是无效的。引用名称
    这个错误提示表明你正在使用一个没有有效分支的Git仓库,或者是Git无法识别当前的分支(通常是由于HEAD被指向了一个无效或空的引用)。具体来说,`'(nobranch)'`是因为你当前处于一个`detachedHEAD`状态(即没有指向一个有效的分支),通常在你检出一个提交(而不是分支)时会出现这种情......
  • PowerDesigner 12小技巧-pd修改外键命名规则-pd添加外键
    PowerDesigner12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键1.附加:工具栏不见了调色板(Palette)快捷工具栏不见了PowerDesigner 快捷工具栏palette不见了,怎么重新打开,找回来呢上网搜索了一下”powerdesigner图形工具栏”,找到了找回PowerDesigner工具......
  • 「LUCKY STUN穿透」使用Cloudflare的页面规则固定和隐藏网页端口
    关于本教程索引│├─关于本教程│├─在STUN穿透环境中使用WEB服务│├─动态端口带来的麻烦│├─“隐藏端口”和固定端口│└─可用的解决方法│├─使用邮件进行通知端口变化│└─使用HTTP重定向│├─网络环境优化和STUN穿透规则设置......
  • 接口测试JMeter使用教程 (三)---接口关联
    我们在测试过程中一定会有这种情况,上一个接口要抓取数据传给下一个接口,也就是上一个接口的相应数据做为下一个接口的请求数据那我们来做这样一个登录然后加入购物车,先捋一下思路。1、登录----token(鉴权)2、加入购物车(把token带过去)那我们先登录后看返回的数据后置处理器......
  • [小说] 悬崖_规则怪谈_转载
    出处全文:https://aweidao1.com/t/44944804Po:gOM0tsU【通讯频道7】“各位听众晚上好,现在是北京时间3点01分,欢迎收听今天晚上的(*杂音),我是你们的老朋友,七七。”“今天我也会在这里,做你们最忠实的(*杂音)。各位听众,如果有任何烦恼想要倾诉,请拨打(*杂音),您将是完全匿名的,并且您的......
  • Code128编码规则及示例
    编码格式​空白区域起始字符数据区域校验码结束字符空白区域所有字符条纹图像都是以黑色开始,白色结束,只有结束字符例外起始字符由于128码有三个字符集。所以有三个起始字符。 字符集包含字符值bsStartA全部大写字母和标点符号和特殊符号{2,1,1......
  • 删除团队关联索引单元测试
    理解了,如果你不能更改RespUtils类,我们可以在测试用例中直接检查BaseResponse对象的成功状态和其他属性。以下是更新后的单元测试代码,不依赖于RespUtils中的方法。更新后的单元测试代码importstaticorg.junit.jupiter.api.Assertions.*;importstaticorg.mockito.Mocki......
  • 工作学习笔记(六)变量命名规则
    在Java中,除了写注释来增加代码的可读性和维护性,还可以通过一些命名规则和约定来提高代码的可读性和维护性。变量命名规则的概述使用有意义的名字:变量名应该具有清晰的含义,能够准确地反映变量的用途。避免使用单个字符或无意义的缩写。小驼峰命名法:在变量名中使用驼峰命......
  • 地球空间网格编码规则
    中国国家标准提出《地球空间网格编码规则》(GB/T40087-2021)是2021年4月30日实施的一项中华人民共和国国家标准外文名称:Geospatialgridencodingrule规定了地球空间网格剖分要求和编码方法。该标准适用于作为空间单元与空间信息组织的地球空间网格剖分和代码标识。   ......