基于h-confidence剪枝的Apriori算法
摘要
当数据集存在倾斜支持度分布时,基于支持度剪枝的Apriori算法无法很好的提取频繁项集,这时需要根据h-confidence进行剪枝。
倾斜支持度分布
一个倾斜支持度分布的例子:

基于支持度剪枝会产出如下问题:
设定过高的支持度阈值会忽略掉一些有趣的规则;
设定过高的支持度阈值会导致:过高的计算成本;会提取出交叉支持模式。
交叉支持模式的定义如下:

为何支持度和置信度失效
考虑如下数据集:

在这样的数据集支持度是无效的:

置信度也是无效的:

如何解决


Python实现
给出数据集:
data = [['a', 'c', 'd'], ['b', 'c', 'e'], ['a', 'b', 'c', 'e'], ['b', 'e']]
生成候选1-项集并计算候选1-项集的支持度计数
# 生成候选1-项集
def createC1(data):
c1 = []
for task in data:
for item in task:
if [item] not in c1:
c1.append([item])
# 排序是因为之后生产频繁k-项集是采用F(k-1)*F(k-1)方法
c1.sort()
# frozenset()返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
return list(map(frozenset, c1))
C1 = createC1(data)
# 计算1-项集的支持度计数
count_c1 = {
}
for task in data:
for item in C1:
if item.issubset(task):
count_c1[item] = count_c1.get(item, 0) + 1
# 排序是为了减少查询次数
count_c1 = dict(sorted(count_c1.items(), key=lambda kv:(kv[1], kv[0]), reverse=True))
print(count_c1)
{
frozenset({
'c'}): 3,
frozenset({
'b'}): 3,
frozenset({
'e'}): 3,
frozenset({
'a'}): 2,
frozenset({
'd'}): 1}
基于全置信度剪枝生成候选2-项集
# 全置信度剪枝适用于倾斜支持度分布的数据集
# 在生成候选2-项集时无需提取频繁1-项集直接根据候选1-项集提取即可
def scanData(data, C_k, h_c, count_c1):
# 计算候选项集的支持度计数
ssCnt = {
}
for task in data:
for can in C_k:
if can.issubset(task):
ssCnt[can] = ssCnt.get(can, 0) + 1
# 计算候选项集的全置信度
retlist = []
Fk = {
}
for key in ssCnt.keys():
for item in count_c1.keys():
if key.issuperset(item):
h

在倾斜支持度分布的数据集中,基于支持度剪枝的Apriori算法表现不佳。文章介绍了h-confidence剪枝的概念,用于解决支持度和置信度失效的问题。通过Python实现展示了如何生成候选项集和支持度计数,并通过测试对比了支持度剪枝与h-confidence剪枝的效果,证明h-confidence剪枝能有效提取强关联规则并剔除交叉支持模式。
最低0.47元/天 解锁文章
4496

被折叠的 条评论
为什么被折叠?



