关联规则算法学习—Apriori

关联规则算法学习—Apriori

一、实验项目:关联规则算法学习
项目性质:设计型

二、实验目的: 理解并掌握关联规则经典算法Apriori算法,理解算法的原理,能够实现算法,并对给定的数据集进行关联规则挖掘

三、实验内容:
1、实现Apriori算法,验证算法的正确性,并将算法应用于给定的数据集Groceries,根据设定的支持度和置信度,挖掘出符合条件的频繁项集及关联规则。
2、挑选几个有代表性的频繁项集和关联规则,记录下来。 3、调节支持度和置信度阈值,重新执行算法,比较结果的不同。

# coding=utf-8
import pandas as pd
import numpy as np

def getDataSet():
    DataSet = pd.read_csv('Groceries.csv', encoding='UTF-8')
    dataSet = np.array(DataSet).tolist()
    columns = np.array(DataSet.columns).tolist()
    data = []
    for d in dataSet:
        d[1] = str(d[1]).split(' ')  # str(d[1]).split(' ') 元素集转化为单个
        data.append(d[1])
    return data, columns

def createItems(dataSet):
    Items = []
    for d in dataSet:
        for item in d:
            if not [item] in Items:  # list 用 not[item] in list
                Items.append([item])
    Items.sort()
    return map(frozenset, Items)


def createSupportItem(D, Items, MinSupport):
    X = {}
    dataSet = list(D)
    items = list(Items)
    sumItem = float(len(dataSet))

    for d in dataSet:
        for item in items:  # 候选集
            if item.issubset(d):  # 候选集为item子集
                if not item in X:
                    X[item] = 1  # 不存在就创建,存在就加一
                else:
                    X[item] += 1
    supportItems = []
    supportData = {}
    for k in X.keys():
        support = X[k] / float(sumItem)  # 支持度
        if support >= MinSupport:
            supportItems.insert(0, k)
        supportData[k] = support
    return supportItems, supportData


def AprioriConf(Lk, k):  # 计算K频繁项集
    # Lk 是上一个频繁项集 last
    # 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:
                retList.append(Lk[i] | Lk[j])
    return retList


def Apriori(dataSet, minSupport):
    Items = createItems(dataSet)
    D = map(set, dataSet)
    L1, supportData = createSupportItem(D, Items, minSupport)
    L = [L1]
    k = 2
    while (len(L[k - 2]) > 0):
        Ck = AprioriConf(L[k - 2], k)
        Lk, Supk = createSupportItem(map(set, dataSet), Ck, MinSupport=minSupport)
        supportData.update(Supk)
        L.append(Lk)
        k += 1
    return L, supportData


def main():
    dataSet, columns = getDataSet()  # dataSet中仅有项目集,没有订单集
    L, Support = Apriori(dataSet, 0.5)
    print('所有频繁项集L:')
    for l in L:
        print(l)
    print('对应支持度Support:')
    for k, v in Support.items():
        print('项目集:', k, '的支持度为:', v)


if __name__ == '__main__':
    main()

运行结果:

运行结果

Apriori 算法是一种关联规则挖掘算法,用于在大规模数据集中查找频繁项集。该算法是基于频繁项集的质:如果一个项集是频繁的,那么它的所有子集也是频繁的。Apriori 算法主要分为两个步骤:频繁项集的生成和关联规则的生成。下面我们来详细了解一下这两个步骤。 1. 频繁项集的生成 Apriori 算法的核心思想是利用先验知识来减少搜索空间。具体来说,我们可以利用 Apriori 原理:一个项集是频繁的,当且仅当它的所有子集都是频繁的。也就是说,如果一个项集不是频繁的,那么它包含的所有子集都不是频繁的,因此我们可以直接舍弃这个项集以及它的所有超集。这样可以减少搜索空间,提高算法效率。 具体来说,频繁项集生成的过程如下: (1)生成所有的单个项集(即每个项只包含一个元素)。 (2)对于每个 k(k≥2)阶项集,从上一轮的频繁 (k-1) 阶项集中选取子集作为其前 k-1 个元素,生成新的 k 阶项集。 (3)扫描数据集,计算每个项集的支持度,筛选出支持度不低于设定阈值的频繁项集。 (4)不断重复步骤(2)和(3),直到无法生成新的频繁项集为止。 2. 关联规则的生成 在得到所有的频繁项集之后,我们需要根据这些项集生成关联规则关联规则是指基于频繁项集之间的关系,推导出的形如 A→B 的规则,表示 A 和 B 之间存在某种关系。关联规则的生成过程如下: (1)对于每个频繁项集 A,生成其所有的非空子集。 (2)对于每个非空子集 B,计算置信度 conf(A→B),如果 conf(A→B)≥设定阈值,则保留规则 A→B。 在计算置信度,我们可以利用以下公式: conf(A→B) = sup(A∪B) / sup(A) 其中 sup(A) 和 sup(A∪B) 分别表示项集 A 和项集 A∪B 在数据集中出现的次数。 总的来说,Apriori 算法是一种高效的关联规则挖掘算法,能够在大规模数据集中快速查找频繁项集和关联规则。但是,由于其需要扫描整个数据集多次,因此对于较大的数据集来说,算法间复杂度较高。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Did然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值