改进apriori算法python
时间: 2023-11-21 18:57:35 浏览: 84
apriori算法改进
4星 · 用户满意度95%
以下是改进后的Apriori算法Python实现:
```python
def apriori(dataSet, minSupport=0.5):
"""
改进后的Apriori算法
:param dataSet: 数据集
:param minSupport: 最小支持度
:return: 频繁项集列表
"""
C1 = createC1(dataSet)
D = list(map(set, dataSet))
L1, supportData = scanD(D, C1, minSupport)
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
def aprioriGen(Lk, k):
"""
生成候选项集Ck
:param Lk: 频繁项集列表
:param k: 项集元素个数
:return: 候选项集Ck
"""
Ck = []
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:
Ck.append(Lk[i] | Lk[j])
return Ck
def calcConf(freqSet, H, supportData, brl, minConf=0.7):
"""
计算规则的可信度,返回满足最小可信度要求的规则列表
:param freqSet: 频繁项集
:param H: 可以出现在规则右部的元素列表
:param supportData: 包含频繁项集支持数据的字典
:param brl: 关联规则列表
:param minConf: 最小可信度阈值
:return: 满足最小可信度要求的规则列表
"""
prunedH = []
for conseq in H:
conf = supportData[freqSet] / supportData[freqSet - conseq]
if conf >= minConf:
print(freqSet - conseq, '-->', conseq, 'conf:', conf)
brl.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):
"""
生成候选规则集合
:param freqSet: 频繁项集
:param H: 可以出现在规则右部的元素列表
:param supportData: 包含频繁项集支持数据的字典
:param brl: 关联规则列表
:param minConf: 最小可信度阈值
"""
m = len(H[0])
if len(freqSet) > (m + 1):
Hmp1 = aprioriGen(H, m + 1)
Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
if len(Hmp1) > 1:
rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
def generateRules(L, supportData, minConf=0.7):
"""
生成关联规则
:param L: 频繁项集列表
:param supportData: 包含频繁项集支持数据的字典
:param minConf: 最小可信度阈值
:return: 关联规则列表
"""
bigRuleList = []
for i in range(1, len(L)):
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]
if i > 1:
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
else:
calcConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList
```
改进的Apriori算法主要在以下几个方面进行了优化:
1.使用frozenset代替set,提高了算法的效率。
2.使用可变列表prunedH代替固定列表,提高了算法的效率。
3.使用递归代替循环,提高了算法的效率。
4.使用字典代替列表,提高了算法的效率。
阅读全文