挖掘频繁模式、关联和相关性:基本概念和方法
发布时间
阅读量:
阅读量
1.频繁模式的概念
频繁模式: 是频繁地出现在数据集中的模式(如项集、子序列或子结构),如果一个子结构频繁的出现,则称它为(频繁的)结构模式。
例子购物篮分析:用户购买电脑同时购买杀毒软件
关联规则:computer =>antivirus_software[support = 2%;confidence = 60%]
规则的支持度(support) 和置信度(condidence) 是规则兴趣度的两种度量。他们分别反映所发现规则的有用性和确定性。2%表示所有事务中同时购买两者占比,60%意味着购买电脑的用户60%也购买了杀毒软件。
支持度(support): 数据集中包含该项集的记录所占的比例。
support(A=>B) = P(A \bigcup B) = \frac{A,B同时发生的事件个数}{总事件个数}
可信度(condfidence): condfidence(A=>B) =P(B|A) = \frac{support(A\bigcup B)}{support(A)} = \frac{support\_ccount(A \bigcup B }{support\_count(A)}
2.关联分析。
- 关联分析: 关联分析是一种规模数据集中寻找有趣业务,这些关系可以有两种形式。
- 频繁项集: 经常出现在一块的物品集合。
- 关联规则: 暗示两种物品之间可能存在很强的关系。
3.Apriori算法简介
Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。算法使用频繁项集性质的先验性质,即频繁项集的所有非空子集也一定是频繁的。Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记为L1。然后,使用L1找出频繁2项集的集合L2,使用L2找出L3,如此下去,直到不能再找到频繁k项集。每找出一个Lk需要一次数据库的完整扫描。Apriori算法使用频繁项集的先验性质来压缩搜索空间。
4.下图是《数据挖掘:概念与技术》(第三版)中挖掘频繁项集的样例图解。

5.使用python实现Apriori算法
"""
#version :python3.7
#author: 蛮小树
#title: MyApriori算法
#Date : 2020-3-27
#reprint: https://zhuanlan.zhihu.com/p/39918644
"""
'''创建一个用于数据测试的函数数据集'''
def loadDataSet():
return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
# C1是大小为1的所有候选项的集合
def createC1(dataSet):
C1 = []
for i in dataSet:
for j in i:
if not [j] in C1:
C1.append([j]) #不重复的存储所有项
C1.sort() #对C1进行排序
#map() 会根据提供的函数对指定序列做映射。
# 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
#frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
return list(map(frozenset,C1))
# C1:[frozenset({1}), frozenset({2}), frozenset({3}), frozenset({4}), frozenset({5})]
#该函数用于从C1生成L1
def scanD(D,Ck,minSupport):
#c参数:数据集 ,候选数据集列表ck 感兴趣的最小支持度minsupport
ssCnt = {}
for tid in D: #遍历数据集
for can in Ck: #遍历候选项
#ssubset() 方法用于判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False。
if can.issubset(tid): #判断候选项中是否包含数据集的各项
if not can in ssCnt:
ssCnt[can] = 1 #不含设为1
else: ssCnt[can] += 1 #有则计数加1
numItems = float(len(D)) #数据集的大小
retlist = [] #L1初始化
supportData = {} #记录候选项中各个数据的支持度
for key in ssCnt:
support = ssCnt[key]/numItems#计算支持度
if support >= minSupport:
#L.insert(index,obj) index -- 对象obj需要插入的索引值,obj -- 要插入列表中的对象。
retlist.insert(0,key) #满足条件加入L1中
supportData[key] = support
return retlist,supportData
#l1的生成情况
print(scanD(loadDataSet(),createC1(loadDataSet()),0.5))
def aprioriGen(LK,K): #组合,向上合并
# Ck参数:频繁项集LK与项集元素个数K
retList = []
lenLK = len(LK)
for i in range(lenLK):
for j in range(i+1,lenLK): #两两组合遍历
L1 = list(LK[i]) [:K-2]
L2 = list(LK[j]) [:K-2]
L1.sort()
L2.sort()
if L1 == L2:#若两个集合的前K-2个项目同时,则将两个集合合并
retList.append(LK[i] | LK[j])
return retList
#apriori
def apriori(dataSet,minSupport = 0.5):
C1 = createC1(dataSet)
D = list(map(set,dataSet))
L1,supportData = scanD(D,C1,minSupport) #单项最小支持度判断0.5,生成L1
L = [L1]
K = 2
while (len(L[K-2]) > 0): #创建包含更大项集的更大列表,直到下一个大的项集为空
CK = aprioriGen(L[K-2],K)
LK,supk = scanD(D,CK,minSupport)
supportData.update(supk)
L.append(LK)
K+= 1
return L,supportData
print(apriori(loadDataSet(),0.5))
output:([[frozenset({5}), frozenset({2}), frozenset({3}), frozenset({1})], [frozenset({2, 3}), frozenset({3, 5}), frozenset({2, 5}), frozenset({1, 3})], [frozenset({2, 3, 5})], []], {frozenset({1}): 0.5, frozenset({3}): 0.75, frozenset({4}): 0.25, frozenset({2}): 0.75, frozenset({5}): 0.75, frozenset({1, 3}): 0.5, frozenset({2, 5}): 0.75, frozenset({3, 5}): 0.5, frozenset({2, 3}): 0.5, frozenset({1, 5}): 0.25, frozenset({1, 2}): 0.25, frozenset({2, 3, 5}): 0.5})
全部评论 (0)
还没有任何评论哟~
