机器学习—关联规则分析之Apriori算法及其python实现

2023-11-01



引言

  关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找到各项之间的关联关系,而这种关系并没有在数据中直接体现出来。以超市的销售数据为例,当存在很多商品时,可能的商品组合数量达到了令人望而却步的程度,这是提取关联规则的最大困难。因此各种关联规则分析算法从不同方面入手减少可能的搜索空间大小以及减少扫描数据的次数。Apriori算法是最经典的挖掘频繁项集的算法,第一次实现在大数据集上的可行的关联规则提取,其核心思想是通过连接产生候选项及其支持度,然后通过剪枝生成频繁项集。

一、一些概念

1.关联规则的一般形式
  1. 关联规则的支持度(相对支持度)
    项集A、B同时发生的概率称为关联规则的支持度(相对支持度)。 S u p p o r t ( A = > B ) = P ( A ∪ B ) Support(A=>B)=P(A∪B) Support(A=>B)=P(AB)
  2. 关联规则的置信度
    项集A发生,则项集B发生的概率为关联规则的置信度。 C o n f i d e n c e ( A = > B ) = P ( B ∣ A ) Confidence(A=>B)=P(B|A) Confidence(A=>B)=P(BA)
2.最小支持度和最小置信度
  1. 最小支持度是衡量支持度的一个阈值,表示项目集在统计意义上的最低重要性
  2. 最小置信度是衡量置信度的一个阈值,表示关联规则的最低可靠性
  3. 强规则是同时满足最小支持度阈值和最小置信度阈值的规则
3.项集
  1. 项集是项的集合。包含 k k k个项的集合称为 k k k项集,如集合{牛奶,麦片,糖}是一个三项集
  2. 项集出现的频率是所有包含项集的事务计数,又称为绝对支持度或支持度计数
  3. 如果项集 I I I的相对支持度满足预定义的最小支持度阈值,则 I I I频繁项集。如果有 k k k项,记为 L k L_k Lk
4.支持度计数
  • 项集A的支持度计数是事务数据集中包含项集A的事务个数,简称项集的频率或计数
  • 一旦得到项集 A 、 B 和 A ∪ B A、B和A∪B ABAB的支持度计数以及所有事务个数,就可以导出对应的关联规则 A = > B A=>B A=>B B = > A B=>A B=>A,并可以检查该规则是否为强规则。
    在这里插入图片描述
    其中 N N N表示总事务个数, σ σ σ表示计数

二、Apriori算法:使用候选产生频繁项集

  Apriori算法的主要思想是找出存在于事务数据集中最大的频繁项集,再利用得到的最大频繁项集与预先设定的最小置信度阈值生成强关联规则。

1.Apriori的性质

  频繁项集的所有非空子集一定是频繁项集。根据这一性质可以得出:向不是频繁项集 I I I的项集中添加事务 A A A,新的项集 I ∪ A I∪A IA一定不是频繁项集。

2.Apriori算法实现过程

第一步:
找出所有频繁项集(支持度必须大于等于给定的最小支持度阈值),在这个过程中连接步与剪枝步相互融合,最终得到最大频繁项集 L k L_k Lk

  • 连接步
    连接步的目的是找到 K K K项集。对于给定的最小支持度阈值,分别对1项候选集 C 1 C_1 C1,剔除小于该阈值的项集得到1项频繁集 L 1 L_1 L1;下一步由 L 1 L_1 L1自身连接产生2项候选集 C 2 C_2 C2,剔除小于该阈值的项集得到2项频繁集 L 2 L_2 L2;再下一步由 L 2 和 L 1 L_2和L_1 L2L1连接产生3项候选集 C 3 C_3 C3,剔除小于该阈值的项集得到3项频繁集 L 3 L_3 L3,这样循环下去,直至由 L k − 1 和 L 1 L_{k-1}和L_1 Lk1L1连接产生 k k k项候选集 C k C_k Ck,剔除小于该阈值的项集得到最大频繁集 L k L_k Lk
  • 剪枝步
    剪枝步紧接着连接步,在产生候选项 C k C_k Ck的过程中起到了减小搜索空间的目的。根据Apriori的性质:频繁项集的所有非空子集也必须是频繁项集,所以不满足该性质的项集将不会存在于 C k C_k Ck中,该过程就是剪枝

第二步:
由频繁项集产生强关联规则。由第一步可知,未超过预定的最小支持阈值的项集已被剔除,如果剩下的这些项集又满足了预定的最小置信度阈值,那么就挖掘出了强关联规则。

3.Apriori算法实现过程实例

  以餐饮行业点餐数据为例,首先先将事务数据整理成关联规则模型所需的数据结构。设最小支持度为0.2,将菜品id编号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Apriori算法—python实现

数据集链接

import numpy as np
import pandas as pd


def connect_string(x, ms):
    """
    与1项频繁集连接生成新的项集
    :param x: 项集
    :param ms:
    :return: 新的项集
    """
    x = list(map(lambda i: sorted(i.split(ms)), x))
    l = len(x[0])
    r = []
    for i in range(len(x)):
        for j in range(i, len(x)):
            if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:
                r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))
    return r


def find_rule(d, support, confidence, ms=u'-'):
    """
    寻找关联规则
    :param d: 数据集
    :param support: 最小支持度
    :param confidence: 最小置信度
    :param ms: 项集之间连接符号
    :return: 强关联规则以及其支持度与置信度
    """
    # 存储输出结果
    result = pd.DataFrame(index=['support', 'confidence'])

    # 1项集的支持度序列
    support_series = 1.0 * d.sum(axis=0) / d.shape[0]
    # 基于给定的最小支持度进行筛选,得到1项频繁集
    column = list(support_series[support_series > support].index)

    # 当1项频繁集个数大于1时
    k = 0
    while len(column) > 1:
        k = k + 1
        print(u'\n正在进行第%s次搜索...' % k)
        column = connect_string(column, ms)
        print(u'数目:%s...' % len(column))
        # 乘积为1表示两个项集同时发生,乘积为0表示不同发生
        sf = lambda i: d[i].prod(axis=1, numeric_only=True)  # 新一批支持度的计算函数

        # 创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
        d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i) for i in column]).T

        # 计算连接后的支持度
        support_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d)
        column = list(support_series_2[support_series_2 > support].index)  # 新一轮支持度筛选
        support_series = support_series.append(support_series_2)

        column2 = []
        # 遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
        for i in column:
            i = i.split(ms)
            for j in range(len(i)):
                column2.append(i[:j] + i[j + 1:] + i[j:j + 1])

        # 定义置信度序列
        cofidence_series = pd.Series(index=[ms.join(i) for i in column2])
        # 计算置信度序列
        for i in column2:
            cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))] / support_series[ms.join(i[:len(i) - 1])]

        for i in cofidence_series[cofidence_series > confidence].index:  # 置信度筛选
            result[i] = 0.0
            result[i]['confidence'] = cofidence_series[i]
            result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]

    result = result.T.sort_values(['confidence', 'support'], ascending=False)  # 结果整理,输出
    print(u'\n结果为:')
    print(result)
    return result


if __name__ == '__main__':
    # 加载数据
    data = pd.read_excel('../data/menu_orders.xls', header=None)
    print('转换原数据到0-1矩阵')
    ct = lambda x: pd.Series(1, index=x[pd.notnull(x)])
    b = map(ct, data.values)
    data = pd.DataFrame(list(b)).fillna(0)
    # 删除中间变脸b
    del b

    support = 0.2  # 最小支持度
    confidence = 0.5  # 最小置信度

    find_rule(data, support, confidence)
转换原数据到0-1矩阵

正在进行第1次搜索...
数目:6...

正在进行第2次搜索...
数目:3...

正在进行第3次搜索...
数目:0...

结果为:
       support  confidence
e-a        0.3    1.000000
e-c        0.3    1.000000
c-e-a      0.3    1.000000
a-e-c      0.3    1.000000
c-a        0.5    0.714286
a-c        0.5    0.714286
a-b        0.5    0.714286
c-b        0.5    0.714286
b-a        0.5    0.625000
b-c        0.5    0.625000
a-c-e      0.3    0.600000
b-c-a      0.3    0.600000
a-c-b      0.3    0.600000
a-b-c      0.3    0.600000

其中,'e—a’表示e发生能够推出a发生,置信度为100%,支持度30%。搜索出的关联规则并不一定有实际意义,需要根据问题背景筛选适当的有意义的规则,并赋予合理的解释。

四、Apriori算法实现—有剪枝步

案例数据百度网盘链接-提取码:1234

import numpy as np
import pandas as pd

# 测试数据集,用于debug
def loadDataSet():
    return [['a', 'c', 'e'], ['b', 'd'], ['b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b'], ['b', 'c'], ['a', 'b'],
            ['a', 'b', 'c', 'e'], ['a', 'b', 'c'], ['a', 'c', 'e']]


def loaddata():
    order_data = pd.read_csv('data/GoodsOrder.csv', header=0, encoding='gbk')
    # 转换数据格式
    order_data['Goods'] = order_data['Goods'].apply(lambda x: "," + x)
    order_data = order_data.groupby('id').sum().reset_index()
    order_data['Goods'] = order_data['Goods'].apply(lambda x: [x[1:]])
    order_data_list = list(order_data['Goods'])
    # print(order_data_list)
    # 分割商品名为每一个元素
    data_translation = []
    for i in order_data_list:
        # 列表中元素为1个字符串,所以用0索引
        p = i[0].split(",")
        data_translation.append(p)
    return data_translation


def creatC1(data):
    """
    找到1项候选集C1
    :param data: 数据集
    :return: 1项候选集C1
    """
    C1 = []
    for row in dataSet:
        for item in row:
            if [item] not in C1:
                C1.append([item])
    # 中文字符串升序排序
    C1.sort()
    # frozenset()返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
    return list(map(frozenset, C1))


def calSupport(D, C, minSupport):
    """
    计算1项候选集的支持度,剔除小于最小支持度的项集,
    :param D: 数据集
    :param C1: 候选集
    :param minSupport: 最小支持度
    :return: 返回1项频繁集及其支持度
    """
    dict_sup = {}  # 中间储存变量,用于计数
    # 迭代每一条数据,对项集中的每一项进行计数
    for i in D:
        for j in C:
            # 集合j是否是集合i的子集,如果是返回True,否则返回False
            if j.issubset(i):
                # 再判断之前有没有统计过,没有统计过的话为1
                if j not in dict_sup:
                    dict_sup[j] = 1
                else:
                    dict_sup[j] += 1
    # 事务总数
    sumCount = float(len(D))
    # 计算支持度,支持度 = 项集的计数/事务总数
    supportData = {}  # 用于存储频繁集的支持度
    relist = []  # 用于存储频繁集
    for i in dict_sup:
        temp_sup = dict_sup[i] / sumCount
        # 将剔除后的频繁项集及其对应支持度保存起来
        if temp_sup > minSupport:
            relist.append(i)
            supportData[i] = temp_sup
    # 返回1项频繁项集及其对应支持度
    return relist, supportData


def aprioriGen(Lk, k):
    """
    改良了剪枝步,原来的Ck是由L1与L(k-1)来连接产生的,这里采用了新的连接方式
    使用剪枝算法,减少了候选集空间,找到k项候选集
    :param Lk: k-1项频繁集
    :param k: 第k项
    :return: 第k项候选集
    """
    reList = []  # 用来存储第k项候选集
    lenLk = len(Lk)  # 第k-1项频繁集的长度
    # 两两组合遍历
    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()
            # 前k-1项相等,则可相乘,这样可以防止重复项出现
            if L1 == L2:
                a = Lk[i] | Lk[j]  # a为frozenset集合
                # 进行剪枝
                a1 = list(a)  # a1为k项集中的一个元素
                b = []  # b为它的所有k-1项子集
                # 构造b:遍历取出每一个元素,转换为set,依次从a1中剔除该元素,并加入到b中
                for q in range(len(a1)):
                    t = [a1[q]]
                    tt = frozenset(set(a1) - set(t))
                    b.append(tt)

                # 当b都是频繁集时,则保留a1,否则,删除
                t = 0
                for w in b:
                    # 如果为True,说明是属于候选集,否则不属于候选集
                    if w in Lk:
                        t += 1
                # 如果它的子集都为频繁集,则a1是候选集
                if len(b) == t:
                    reList.append(b[0] | b[1])

    return reList


def scanD(D, Ck, minSupport):
    """
    计算候选k项集的支持度,剔除小于最小支持度的候选集,得到频繁k项集及其支持度
    :param D: 数据集
    :param Ck: 候选k项集
    :param minSupport: 最小支持度
    :return: 返回频繁k项集及其支持度
    """
    sscnt = {}  # 存储支持度
    for tid in D:  # 遍历数据集
        for can in Ck:  # 遍历候选项
            if can.issubset(tid):  # 判断数据集中是否含有候选集各项
                if can not in sscnt:
                    sscnt[can] = 1
                else:
                    sscnt[can] += 1

    # 计算支持度
    numItem = len(D)  # 事务总数
    reList = []  # 存储k项频繁集
    supportData = {}  # 存储频繁集对应支持度
    for key in sscnt:
        support = sscnt[key] / numItem
        if support > minSupport:
            reList.insert(0, key)  # 满足条件的加入Lk中
            supportData[key] = support
    return reList, supportData


def apriori(dataSet, minSupport=0.2):
    """
    apriori关联规则算法
    :param data: 数据集
    :param minSupport: 最小支持度
    :return: 返回频繁集及对应的支持度
    """
    # 首先,找到1项候选集
    C1 = creatC1(dataSet)
    # 使用list()转化为列表,用于支持度计算
    D = list(map(set, dataSet))
    # 计算1项候选集的支持度,剔除小于最小支持度的项集,返回1项频繁集及其支持度
    L1, supportData = calSupport(D, C1, minSupport)
    L = [L1]  # 加列表框,使得1项频繁集称为一个单独的元素

    k = 2  # k项
    # 跳出循环的条件是没有候选集
    while len(L[k - 2]) > 0:
        # 产生k项候选集Ck
        Ck = aprioriGen(L[k - 2], k)
        # 计算候选k项集的支持度,剔除小于最小支持度的候选集,得到频繁k项集及其支持度
        Lk, supK = scanD(D, Ck, minSupport)
        # 将supK中的键值对添加到supportData
        supportData.update(supK)
        # 将第k项的频繁集添加到L中
        L.append(Lk)  # L的最后一个值为空值
        k += 1
    del L[-1]
    # 返回频繁集及其对应的支持度;L为频繁项集,是一个列表,1,2,3项集分别为一个元素
    return L, supportData


def getSubset(fromList, totalList):
    """
    生成集合的所有子集
    :param fromList:
    :param totalList:
    """
    for i in range(len(fromList)):
        t = [fromList[i]]
        tt = frozenset(set(fromList) - set(t))  # k-1项子集

        if tt not in totalList:
            totalList.append(tt)
            tt = list(tt)
            if len(tt) > 1:
                getSubset(tt, totalList)  # 所有非1项子集


def calcConf(freqSet, H, supportData, ruleList, minConf):
    """
    计算置信度,并剔除小于最小置信度的数据,这里利用了提升度概念
    :param freqSet: k项频繁集
    :param H: k项频繁集对应的所有子集
    :param supportData: 支持度
    :param RuleList: 强关联规则
    :param minConf: 最小置信度
    """
    # 遍历freqSet中的所有子集并计算置信度
    for conseq in H:
        conf = supportData[freqSet] / supportData[freqSet - conseq]  # 相当于把事务总数抵消了

        # 提升度lift计算lift=p(a&b)/p(a)*p(b)
        lift = supportData[freqSet] / (supportData[conseq] * supportData[freqSet - conseq])
        if conf >= minConf and lift > 1:
            print(freqSet - conseq, '-->', conseq, '支持度', round(supportData[freqSet], 6), '置信度:', round(conf, 6),
                  'lift值为:', round(lift, 6))
            ruleList.append((freqSet - conseq, conseq, conf))


def get_rule(L, supportData, minConf=0.7):
    """
    生成强关联规则:频繁项集中满足最小置信度阈值,就会生成强关联规则
    :param L: 频繁集
    :param supportData: 支持度
    :param minConf: 最小置信度
    :return: 返回强关联规则
    """
    bigRuleList = []  # 存储强关联规则
    # 从2项频繁集开始计算置信度
    for i in range(1, len(L)):
        for freqSet in L[i]:
            H1 = list(freqSet)
            all_subset = []  # 存储H1的所有子集
            # 生成所有子集
            getSubset(H1, all_subset)
            # print(all_subset)
            # 计算置信度,并剔除小于最小置信度的数据
            calcConf(freqSet, all_subset, supportData, bigRuleList, minConf)
    return bigRuleList


if __name__ == '__main__':
    dataSet = loaddata()
    # 返回频繁集及其对应的支持度
    L, supportData = apriori(dataSet, minSupport=0.02)
    # 生成强关联规则
    rule = get_rule(L, supportData, minConf=0.35)

生成的强关联规则如下:

frozenset({'水果/蔬菜汁'}) --> frozenset({'全脂牛奶'}) 支持度 0.02664 置信度: 0.368495 lift值为: 1.44216
frozenset({'人造黄油'}) --> frozenset({'全脂牛奶'}) 支持度 0.024199 置信度: 0.413194 lift值为: 1.617098
frozenset({'仁果类水果'}) --> frozenset({'全脂牛奶'}) 支持度 0.030097 置信度: 0.397849 lift值为: 1.557043
frozenset({'牛肉'}) --> frozenset({'全脂牛奶'}) 支持度 0.021251 置信度: 0.405039 lift值为: 1.58518
frozenset({'冷冻蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.020437 置信度: 0.424947 lift值为: 1.663094
frozenset({'本地蛋类'}) --> frozenset({'其他蔬菜'}) 支持度 0.022267 置信度: 0.350962 lift值为: 1.813824
frozenset({'黄油'}) --> frozenset({'其他蔬菜'}) 支持度 0.020031 置信度: 0.361468 lift值为: 1.868122
frozenset({'本地蛋类'}) --> frozenset({'全脂牛奶'}) 支持度 0.029995 置信度: 0.472756 lift值为: 1.850203
frozenset({'黑面包'}) --> frozenset({'全脂牛奶'}) 支持度 0.025216 置信度: 0.388715 lift值为: 1.521293
frozenset({'糕点'}) --> frozenset({'全脂牛奶'}) 支持度 0.033249 置信度: 0.373714 lift值为: 1.462587
frozenset({'酸奶油'}) --> frozenset({'其他蔬菜'}) 支持度 0.028876 置信度: 0.402837 lift值为: 2.081924
frozenset({'猪肉'}) --> frozenset({'其他蔬菜'}) 支持度 0.021657 置信度: 0.375661 lift值为: 1.941476
frozenset({'酸奶油'}) --> frozenset({'全脂牛奶'}) 支持度 0.032232 置信度: 0.449645 lift值为: 1.759754
frozenset({'猪肉'}) --> frozenset({'全脂牛奶'}) 支持度 0.022166 置信度: 0.38448 lift值为: 1.504719
frozenset({'根茎类蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.048907 置信度: 0.448694 lift值为: 1.756031
frozenset({'根茎类蔬菜'}) --> frozenset({'其他蔬菜'}) 支持度 0.047382 置信度: 0.434701 lift值为: 2.246605
frozenset({'凝乳'}) --> frozenset({'全脂牛奶'}) 支持度 0.026131 置信度: 0.490458 lift值为: 1.919481
frozenset({'热带水果'}) --> frozenset({'全脂牛奶'}) 支持度 0.042298 置信度: 0.403101 lift值为: 1.577595
frozenset({'柑橘类水果'}) --> frozenset({'全脂牛奶'}) 支持度 0.030503 置信度: 0.36855 lift值为: 1.442377
frozenset({'黄油'}) --> frozenset({'全脂牛奶'}) 支持度 0.027555 置信度: 0.497248 lift值为: 1.946053
frozenset({'酸奶'}) --> frozenset({'全脂牛奶'}) 支持度 0.056024 置信度: 0.401603 lift值为: 1.571735
frozenset({'其他蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.074835 置信度: 0.386758 lift值为: 1.513634
frozenset({'全脂牛奶', '酸奶'}) --> frozenset({'其他蔬菜'}) 支持度 0.022267 置信度: 0.397459 lift值为: 2.054131
frozenset({'酸奶', '其他蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.022267 置信度: 0.512881 lift值为: 2.007235
frozenset({'全脂牛奶', '根茎类蔬菜'}) --> frozenset({'其他蔬菜'}) 支持度 0.023183 置信度: 0.474012 lift值为: 2.44977
frozenset({'根茎类蔬菜', '其他蔬菜'}) --> frozenset({'全脂牛奶'}) 支持度 0.023183 置信度: 0.48927 lift值为: 1.914833

五、封装好的apriori算法的调用

import numpy as np
import pandas as pd
import xlrd
from mlxtend.frequent_patterns import apriori  # 生成频繁项集
from mlxtend.frequent_patterns import association_rules  # 生成强关联规则
import warnings

warnings.filterwarnings("ignore")  # 用于排除警告


def loaddata():
    order_data = pd.read_csv('data/GoodsOrder.csv', header=0, encoding='gbk')
    # 转换数据格式
    order_data['Goods'] = order_data['Goods'].apply(lambda x: "," + x)
    order_data = order_data.groupby('id').sum().reset_index()
    order_data['Goods'] = order_data['Goods'].apply(lambda x: [x[1:]])
    order_data_list = list(order_data['Goods'])
    # print(order_data_list)
    # 分割商品名为每一个元素
    data_translation = []
    for i in order_data_list:
        # 列表中元素为1个字符串,所以用0索引
        p = i[0].split(",")
        data_translation.append(p)
    return data_translation


if __name__ == '__main__':
    dataSet = loaddata()
    column_list = []
    for var in dataSet:
        column_list = set(column_list) | set(var)
    print('转换原数据到0-1矩阵')
    data = pd.DataFrame(np.zeros((len(dataSet), 169)), columns=column_list)
    for i in range(len(dataSet)):
        for j in dataSet[i]:
            data.loc[i, j] += 1
    # apriori算法
    frequent_itemsets = apriori(data, min_support=0.02, use_colnames=True)
    print(pd.DataFrame(frequent_itemsets))
    pd.DataFrame(frequent_itemsets).to_csv('frequent_itemsets.csv')
    # 生成关联准则
    rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.35)
    print(pd.DataFrame(rules))
    pd.DataFrame(rules).to_csv('rules.csv')
      support             itemsets
0    0.038434                (威化饼)
1    0.026029               (一般饮料)
2    0.025826               (一般肉类)
3    0.033452           (超高温杀菌的牛奶)
4    0.064870                (黑面包)
..        ...                  ...
117  0.024301             (香肠, 苏打)
118  0.027351             (苏打, 酸奶)
119  0.021047             (苏打, 糕点)
120  0.023183  (根茎类蔬菜, 全脂牛奶, 其他蔬菜)
121  0.022267     (酸奶, 全脂牛奶, 其他蔬菜)

[122 rows x 2 columns]
      antecedents consequents  ...  leverage  conviction
0           (黑面包)      (全脂牛奶)  ...  0.008641    1.217899
1            (猪肉)      (全脂牛奶)  ...  0.007435    1.209520
2            (猪肉)      (其他蔬菜)  ...  0.010502    1.291779
3            (牛肉)      (全脂牛奶)  ...  0.007845    1.251315
4         (根茎类蔬菜)      (全脂牛奶)  ...  0.021056    1.350401
5         (根茎类蔬菜)      (其他蔬菜)  ...  0.026291    1.426693
6        (水果/蔬菜汁)      (全脂牛奶)  ...  0.008168    1.178904
7          (其他蔬菜)      (全脂牛奶)  ...  0.025394    1.214013
8          (人造黄油)      (全脂牛奶)  ...  0.009235    1.268706
9            (凝乳)      (全脂牛奶)  ...  0.012517    1.461085
10           (黄油)      (全脂牛奶)  ...  0.013395    1.480817
11        (柑橘类水果)      (全脂牛奶)  ...  0.009355    1.179008
12         (冷冻蔬菜)      (全脂牛奶)  ...  0.008149    1.294636
13         (热带水果)      (全脂牛奶)  ...  0.015486    1.247252
14          (酸奶油)      (全脂牛奶)  ...  0.013916    1.352735
15         (本地蛋类)      (全脂牛奶)  ...  0.013783    1.412030
16           (酸奶)      (全脂牛奶)  ...  0.020379    1.244132
17           (糕点)      (全脂牛奶)  ...  0.010516    1.188729
18        (仁果类水果)      (全脂牛奶)  ...  0.010767    1.236375
19           (黄油)      (其他蔬菜)  ...  0.009308    1.263065
20          (酸奶油)      (其他蔬菜)  ...  0.015006    1.350565
21         (本地蛋类)      (其他蔬菜)  ...  0.009991    1.242619
22  (根茎类蔬菜, 全脂牛奶)      (其他蔬菜)  ...  0.013719    1.533320
23  (根茎类蔬菜, 其他蔬菜)      (全脂牛奶)  ...  0.011076    1.457687
24     (全脂牛奶, 酸奶)      (其他蔬菜)  ...  0.011427    1.338511
25     (酸奶, 其他蔬菜)      (全脂牛奶)  ...  0.011174    1.528340
[26 rows x 9 columns]

参考于《python数据分析与挖掘实战》,后面有时间的话,会基于《机器学习实战》学习一下FP-Tree关联规则分析


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!
在这里插入图片描述


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习—关联规则分析之Apriori算法及其python实现 的相关文章

随机推荐

  • mysql 半同步复制(semi_sync_replication)搭建及使用

    google为mysql开发了一个补丁一个基于半同步的补丁 应用与mysql5 0 回来mysql打上了该补丁 并在5 5版本中使用 半同步复制的理念是什么呢 在数据库更改操作执行前 确保更改操作至少被写入一台slave磁盘中 意味着着对于
  • JsonView--离线查看JSON格式化工具

    1 软件工具准备 下载地址如下 链接 https pan baidu com s 1opc 6kcnGSykiUtjVPKDg 提取码 grmt 2 解压后 无需安装 直接运行JsonView exe 打开界面如下 将json格式的数据 复
  • CTP接口入门

    该文章主要讲什么 这篇文章的面向对象是有一些C 基础 并且想用C 来做程式化交易的同学 这篇文章可以算是我的程式化学习笔记中的一篇 其中介绍了CTP的简单的使用方式 并且附上了一些代码以及我在试用的时候遇到的一些小坑 什么是CTP CTP是
  • C++:sprintf()的用法

    转 http blog csdn net masikkk article details 5634886 更多 http blog csdn net zjuwispersure article details 6083982 在将各种类型的
  • 使用ThreadLocal请务必remove

    场景说明 压测的时候发现调用某个接口同一个入参 返回的商品数据不一致 使用技术 threadLocal 问题原因 使用ThreadLocal没有remove 导致问题 1内存溢出 ThreadLocal依赖没有释放 无法GC 2线程池的某个
  • 基于STM32F103HAL库的声音定位系统

    这是一道学校出的电赛题目 要求在100 100 的平面上实现定位实现声音定位 由于一米太大了 我们就做了40 的 下面的讲解我按照40厘米的写 用到的处理器是 接下来分享一下调试心得 硬件部分需要制作发声装置和接收装置 详细可以参考这个文章
  • 逆向分析爬取动态网页

    在确认网页是动态网页后 需要获取从网页响应中由JavaScript动态加载生成的信息 在谷歌浏览器中爬取今日头条首页的信息 步骤如下 1 F12 键打开今日头条首页的网页调试工具 2 点击 Network 选项卡后 发现有很多响应 XHR是
  • DETR特征图可视化代码

    一共分为5个步骤 加载DETR模型及获取训练好的参数 下载待检测的图片并进行预处理和前馈过程得到预测结果 准备好前馈该图片时网络的各类参数 重点 求attn output weigths以绘制各个head的注意力权重 重点 画图 在介绍具体
  • Testng+java+chromedriver

    chromedriver的版本一定要与Chrome的版本一致 不然就不起作用 查看电脑安装的谷歌浏览器版本 在浏览器中输入chrome version 建议关闭谷歌自动更新 防止后续版本不对应 具体参考 https jingyan baid
  • win10+系统更新服务器失败怎么回事啊,windows10系统更新失败如何解决

    很多用户都开始升级windows10系统 而在使用过程中经常会需要更新 然而有时候可能会遇到更新失败的情况 很多用户不知道要怎么解决 其实方法很简单 这就给大家讲解一下windows10系统更新失败的具体解决步骤 方法一 在操作前 需要先查
  • Android应用程序的Activity启动过程简要介绍和学习计划

    Android应用程序的Activity启动过程简要介绍和学习计划 分类 Android 2011 08 14 15 46 41045人阅读 评论 19 收藏 举报 android button encoding layout 框架 在An
  • 哪吒社区 - 风火轮计划

    目录 风火轮计划 全新起航 风火轮计划内容 一 Java零基础入门 二 Java基础教程系列 三 SpringBoot系列教程 加入方式 1 连续七天参与Java技能树每日打卡活动 2 发表一篇标题为 哪吒社区Java技能树 的学习博客 记
  • 程序员副业大揭秘:如何利用技术优势实现财富自由?

    前几天 我写了一篇文章 工资 喂饱肚子 副业 养活灵魂 职场人的生存之道 然后很多人就问 程序员这么忙 哪有时间去搞副业啊 昨天 我在知乎上正好看到一个类似的问题 我就用这个问题 回答一下大家对做副业的疑问 还是以我为例吧 是卷技术 还是空
  • make[2]:***没有规则制作目标XXX,由XXX需求。停止。

    记录一次驱动编写中遇到的错误 写了一个简单的驱动 编写Makefile 内容如下 模块名称 obj m xxx o kernel路径 KDIR yyy zzz 获取当前路径 PWD shell pwd all make C KDIR M P
  • 用Python爬虫做一个短视频+评论下载小工具

    成品展示 复制以上代码用于视频下载 按照以上步骤获取评论路径复制 选择要保存到哪个文件夹中 输入复制的视频地址和评论地址 保存完成 获取音视频部分主要代码 只是主要功能代码 def get data urls address respons
  • 基于SpringBoot的冬奥会科普平台

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 采用Vue和HTML技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Ec
  • 方法-学术翻译工具

    1 推荐谷歌 2 其它
  • python学习笔记03

    函数 def functionname parameters 函数文档字符串 functionsuite return expression args 可变参数 可以是从零个到任意个 自动组装成元组 kw 关键字参数 可以是从零个到任意个
  • numpy

    一 什么是维度 需要几个维度描述一个空间 一维 x 二维 x y 三维 x y z 1 1 创建NumPy数组的多种方式 创建NumPy数组的多种方式 array 将输入数据转换为ndarray 推断dtype或显示指定 arange 类似
  • 机器学习—关联规则分析之Apriori算法及其python实现

    文章目录 引言 一 一些概念 1 关联规则的一般形式 2 最小支持度和最小置信度 3 项集 4 支持度计数 二 Apriori算法 使用候选产生频繁项集 1 Apriori的性质 2 Apriori算法实现过程 3 Apriori算法实现过