一、关联分析:可以在大规模大数据中寻找数据中存在的有趣关系。
经过关联分析的数据可以有两种形式的关系存在:
①频繁项集(frequent item sets):支持度大于预定义的最小支持度阈值的项集。也就是经常出现的在一起的数据的集合。(支持度:表示前项与后项在一个数据集中同时出现的频率。)②关联规则:(association rules):关联规则是形如X→Y的蕴涵式,其中, X和Y分别称为关联规则的先导和后继。其中,关联规则XY,存在支持度和置信度。也就是暗示两种物品之间存在很强的关系。(置信度: 置信度表示在先决条件X发生的情况下,由关联规则”X→Y“推出Y的概率。)
二、下面用实例来详细了解。
1、由图中杂货铺的数据实例:
支持度:豆奶 :交易中出现的次数(4)/一共交易的次数(5)=4/5 ;豆奶+莴苣:3/5 这便是数据的支持度
关联规则 :我们举例 设 最小支持度=0.5 最小置信度 = 0.4 取数据中: 尿布 + 葡萄酒
由表中数据看出: 1,2,3,4 都有尿布, 1,2,3都有尿布+葡萄酒
则有:尿布+葡萄酒 的支持度 = 3/5 > 最小支持度 0.5 即为频繁项集。
尿布的支持度= 4/5
所以:尿布+葡萄酒的置信度= 3/5 / 4/5 =3/4 =0.75 >最小置信度0.4
所以 :尿布与葡萄酒存在关联。
2、支持度和置信度就是用来量化关联分析的一个一种方法。
倘若我们要是想寻找支持度80%以上项集,便需要将数据集元素的组合全部列举出来然后进行频率计算,如果遇到大量数据,这种方法也就不合适了,因此,我们便引入Apriori 算法来帮助我们。
三、Apriori算法
1.什么是Apriori算法?
Apriori算法是使用一种称作逐层搜索的迭代方法。
(1)通过遍历数据集,获得所有的频繁1项集。(如果事件A中包含k个元素,那么称这个事件A为k项集,并且事件A满足最小支持度阈值的事件称为频繁k项集。频繁1项集即为k=1时。)记作L1。然后利用L1 找到频繁2项集的集合,L2找L3,如此下去,直到再也找不出任何频繁k项集。最后在所有的频繁集中找出强规则,也就是我们认为的规则。
例:[[1,3,5,],[2,3,4],[1,2,3],[1,2,4,5],[1,2,3,4]] 设 支持度为0.5
该数集中所有的1项集为:[1] ,[2], [3], [4] ,[5]
则根据支持度大于最小支持度的原则,所有的频繁1项集为: [1], [2], [3], [4] 所以:L1 = [[1],[2],[3],[4]]
则L2的获得 就需要将L1 中的元素全部混合搭配,然后求出每个2项集的支持度,即获得频繁2项集。
普通2项集为[1,2][2,3][3,4][1,3][1,4][2,4]则频繁2项集为[[1,2][2,3][2,4][1,3]]
以此类推,直到找不出频繁K项集。
(2)Apriori算法有一条性质:任意频繁项集的所有非空子集也是必须是频繁的。因为假如P(I) < 最小支持度的阈值,
当所有元素A添加到I中时,结果项集(A∩I)不可能比I出现的次数更多。因此A∩I 也不是频繁的。
从上面的例子理解就是:已知[1,4] 不是频繁项集,如果将元素3 添加入[1,4],[1,3,4]项集 也肯定不是频繁项集。
因为1,4的频率已经不足,多余一个3 也没有任何意义 ,1,3,4同时出现的几率是建立在14同时出现的基础上。
2、连接步和剪枝步
(1)连接步:若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个元素相同,而最后一项不同,则证明他们是可以连接的,可以连接生成k项集。
举例:[1,2,3] 和[1,2,4]他们可以连接生成[1,2,3,4],而[1,2,3][2,3,4],两个两项集的前k-2不同,便不是连接步。
(2)剪枝步:若一个项集的子集不是频繁项集,那这个项集肯定也不是频繁项集。原因可以通过上面的性质推出。
(1).首先读取数据集,计算出每个1项集的支持度,确定频繁1项集。(因此,我们定义的函数参数中应该有一个参数为我们定义的最小支持度support=___)
(2)从2项集开始循环,由频繁k-1项集生成频繁k项集。
连接步:为了预先生成频繁项集,将两个不同的项进行JOIN运算,得到频繁k项集,以减少运算。
剪枝步:同理,为了方便运算,将不是频繁项集的1项集,将包含一项集的元素排出。
扫描数据库,计算之前2.1过滤后得到的k项集,计算支持度,舍弃掉非频繁项集。
(3)当当前的频繁k项集,只有一个项集时 跳出循环。
在剪枝步中的每个元素需要在数据库中进行验证来决定是否加入,这里的验证过程是算法的一个瓶颈,这个方法要求:多次扫描很大的数据库,可能产生大量的候选集,以及可能需要重复扫面数据库,这Apriori算法的两大缺点。
交易ID |
商品ID列表 |
T100 |
I1,I2,I5 |
T200 |
I2,I4 |
T300 |
I2,I3 |
T400 |
I1,I2,I4 |
T500 |
I1,I3 |
T600 |
I2,I3 |
T700 |
I1,I3 |
T800 |
I1,I2,I3,I5 |
T900 |
I1,I2,I3 |
上面表格是9次交易记录。下面我们可以通过上面的Apriori算法流程构思一下。
首先,我们获得1项集C1={[I1],[I2],[I3],[I4],[I5]},支持度分别为:6/9、7/9、6/9、2/9、2/9 我们预设最小支持度为:2/9
所以确定频繁1项集L1 = {[I1],[I2],[I3]} 由L1 组合 得到 C2项集={[I1,I2],[I1,I3][I1,I4][I1,I5][I2,I3][I2,I4][I2,I5][I3,I4][I3,I5]
[I4,I5]},支持度次数分别为{4,4,1,2,4,2,2,0,1,0},然对C2 进行计算,排出剩余的非频繁2项集,得到频
繁2项集L2={[I1,I2][I1,I3][I2,I3][I1,I5][I2,I4][I2,I5]},接下来对频繁2项集中的数据首先进行连接,生成3项集={[I1,I2,I3],
[I1,I2,I5][I2,I4,I5],[I2,I3,I4][I2,I3,I5]},此时应用剪枝,将含有[I1,I4],[I3,I4][I3,I5][I4,I5]这些非频繁项集的3项集排除,得到C1=
{[I1,I2,I3],[I1,I2,I5]} 分别计算支持度[2 ,2] ,则 频繁3项集L3={I1,I2,I3],[I1,I2,I5]} ,继续通过连接,得到4项集{[I1,I2,,I3,I5]}
支持度为1/9 < 2/9 所以: 我们返回 上一次的计算结果。即L3.作为我们分析关联规则的频繁多项集。
import numpy as np
def loadDataSet():
return [[1,3,5],[1,2,3,4],[2,3,4,5],[2,4],[1,3,4],[2,5],[1,2,3,4,5]]
def creatC1(dataSet):
C1 = []
for i in dataSet:
for item in i:
if not [item] in C1:
C1.append([item])
print("sort‘从小到大排序前’C1=",C1)
C1.sort()
print("sort排序后=",C1)
print('frozenset=', map(frozenset, C1))
return list(map(frozenset, C1 ))
def hou_xuan_D(D,C,minsupport):
zhi_chi_ci_shu = {}
for a in D:
for b in C:
if b.issubset(a):
if not a in zhi_chi_ci_shu:
zhi_chi_ci_shu[a] = 1
else:
zhi_chi_ci_shu[a] += 1
D_de_shu_liang = float(len(D)) #后面需要计算支持度
pin_fan_list = [] #支持度大于最小支持度的集合
zhi_chi_du_dataSet={}
for c in zhi_chi_ci_shu:
support = zhi_chi_ci_shu[c] / D_de_shu_liang
if support >= minsupport:
pin_fan_list.istert(0,c) #0是要插入到的索引值,c是插入的对象。
zhi_chi_du_dataSet[c] = support
return pin_fan_list,zhi_chi_du_dataSet
dataSet = loadDataSet()
D = list(map(set,dataSet))
D
C=creatC1(dataSet)
C