Apriori介绍及代码批注

一、Apriori原理解析

1. 概述

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

2. 关键词

关联分析:找出物品中的潜在关系。

频繁项集:频繁一起出现的物品集的集合。

关联规则:两种物品存在的关系(先找频繁项集,再根据关联规则找关联物品)。

支持度(Support):项集A和B的支持度被定义为数据集中同时包含这两项集的记录所占的比例(通俗理解,就是事件A和B同时发生的概率)。公式为Support(A=>B)=P(A∪B)。

置信度(可信度)(Confidence):项集A发生,则项集B发生的概率为关联规则的置信度(通俗理解,在A发生的情况下B发生的概率为多少P(B/A))。公式为Confidence(A=>B)=P(B|A)。

3. Apriori算法

Apriori的作用是根据物品间的支持度找出物品中的频繁项集。通过上面我们知道,支持度越高,说明物品越受欢迎。那么支持度怎么决定呢?这个由我们主观决定,我们会给Apriori提供一个最小支持度参数,然后Apriori会返回比这个最小支持度高的那些频繁项集。

要使用Apriori算法,我们至少需要提供两个参数,数据集和最小支持度。我们从前面已经知道了Apriori会遍历所有的物品组合,遍历的方法就是使用递归。先遍历1个物品组合的情况,剔除掉支持度低于最小支持度的数据项,然后用剩下的物品进行组合。遍历2个物品组合的情况,再剔除不满足条件的组合。不断递归下去,直到不再有物品可以组合。
在这里插入图片描述
其核心是:如果一个项集是非频繁项集,那么它的所有超集也是非频繁项集。可以发现如果{A,B}这个项集是非频繁的,那么{A,B}这个项集的超集,{A,B,C},{A,B,D}等等也都是非频繁的,这些就都可以忽略不去计算,从而减轻计算,实现剪枝。
在这里插入图片描述

二、代码批注

1. Apriori批注

python">from __future__ import print_function
import pandas as pd


def connect_string(x, ms):
    """
    :param x: column
    :param ms: 连接符
    :return: # 返回与1项频繁集连接生成新的项集
    """

    # 这里的map是映射map,与series.map不一样,下面是利用series的写法
    # column = pd.Series(column)
    # x = list(column.map(lambda i: sorted(i.split('--'))))
    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)):
            # 这里的意思就是{a,b,c} VS {a,b,d} -> {a,b,c,d}(a和b相同,c与d不同,最后向r里添加a,b与c,d)
            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: 符合支持度与置信度的关联规则集
    """
    # 结果集合,最后to_excel保存
    result = pd.DataFrame(index=['support', 'confidence'])

    # 支持度序列:就是几个关联的数据在数据集中出现的次数占总数据集的比重。或者说几个数据关联出现的概率。
    # 1项集的支持度序列(sum():进行列求值;len():数据量)
    support_series = 1.0 * d.sum() / len(d)  # 默认index就是column
    # 初步根据支持度筛选
    # 𝑆𝑢𝑝𝑝𝑜𝑟𝑡(𝑋,𝑌)=𝑃(𝑋𝑌)=𝑛𝑢𝑚𝑏𝑒𝑟(𝑋𝑌)/𝑛𝑢𝑚(𝐴𝑙𝑙𝑆𝑎𝑚𝑝𝑙𝑒𝑠)
    column = list(support_series[support_series > support].index)
    k = 0

    while len(column) > 1:
        k = k + 1
        print(u'\n正在进行第%s次搜索...' % k)

        # 获得新的频繁集
        column = connect_string(column, ms)

2. main_apr.py

python">"""
使用Apriori算法挖掘菜品订单关联规则
"""
from __future__ import print_function
from apriori import *  # 导入自行编写的apriori函数
from timeit import default_timer as timer

inputFile = '../data/Income.csv'
# 结果文件
outputFile = '../tmp/apriori_rules.xls'

# 读取数据
data1 = pd.read_csv(inputFile)
data2 = data1.drop('Unnamed: 0', 1)  # 这个1是省略了axis,来区分行与列

# 最小支持度
support = 0.1

# 最小置信度
confidence = 0.9

# 连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符
ms = '---'

# 保存结果
tic = timer()

# 保存结果
find_rule(data2, support, confidence, ms).to_excel(outputFile)

toc = timer()

# 计算耗时
print(toc - tic)

三、运行结果

在这里插入图片描述
根据上述结果,可以观察到,支持度和置信度越高符合条件的频繁集会越少,所花时间、递归次数就越少;递归次数根据源码可得主要取决于支持度(代码中的support_series列表),支持度越大递归的次数也就会越少。对于该组数据,如果支持度为0.1的化符合条件的数据量太大,把置信度调整到0.9也有四千多条,感觉没有太大的意义,后期也比较难分析。所以在支持度为0.2的情况下效果更好一些。

四、优缺点

  • 优点
    1)Apriori算法采用逐层搜索的迭代方法,算法简单明了,没有复杂的理 论推导,也易于实现。
    2)适合事务数据库的关联规则挖掘。
    3)适合稀疏数据集。根据以往的研究,该算法只能适合稀疏数据集的关 联规则挖掘,也就是频繁项目集的长度稍小的数据集。
  • 缺点
    1)对数据库的扫描次数过多。
    2)Apriori算法可能产生大量的候选项集。
    3)在频繁项目集长度变大的情况下,运算时间显著增加。
    4)采用唯一支持度,没有考虑各个属性重要程度的不同。
    5)算法的适应面窄。

http://www.niftyadmin.cn/n/5130705.html

相关文章

日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp120dll丢失”。那么,究竟什么是msvcp120dll文件?当它丢失时,我们会遇到哪些问题呢?本文将从以下几个方面进行详细阐述。 msvcp120dll是…

vue3+ts+threejs 1.创建场景

效果 创建画布容器元素 <script setup lang"ts"> ... // 画布容器 const canvasRef ref<HTMLElement>() const canvasSize ref<{ width: number, height: number }>({width: 0, height: 0})// 监控更新画布尺寸 function handleResize(entry: R…

fastadmin分类下拉(多级分类)使用教程

效果图1&#xff1a; 在后台分类管理中&#xff0c;添加需要的分类数据 效果图2&#xff1a; 在后台添加页面&#xff0c;点击下拉即可出现分类多级下拉数据 以上就是效果图。 分类下拉实现步骤&#xff1a; 1.更改控制器 找到需要修改的控制器&#xff0c;修改公共方法 _i…

引入个性化标签的协同过滤推荐算法研究_邢瑜航

第3章 引入个性化标签的I-CF推荐算法 3.2.2 相似性度量方法 3.2.3 改进后的算法步骤与流程

react高阶成分(HOC)例子效果

使用React函数式组件写了一个身份验证的一个功能&#xff0c;示例通过高阶组件实现的一个效果展示&#xff1a; import React, { useState, useEffect } from react;// 定义一个高阶组件&#xff0c;它接受一个组件作为输入&#xff0c;并返回一个新的包装组件 const withAuth…

CSRF防范介绍之一

一、前言 CSRF是Cross Site Request Forgery的缩写&#xff0c;即跨站请求伪造&#xff0c;CSRF攻击是借助受害者的Cookie骗取服务器的信任&#xff0c;以受害者名义伪造请求对服务器进行攻击&#xff0c;一直以来有个疑问&#xff0c;前后端分离使用LocalStorage存储用户令牌…

[SQL开发笔记]DELETE 语句:删除表中的行

一、功能描述: DELETE 语句:用于删除表中的行 二、DELETE 语句语法详解: DELETE 语法 DELETE FROM table_nameWHERE some_column=some_value; 三、DELETE 语句开发实例: 目标数据库及表:使用 DRobot数据库,"T_Drobot&

剑指JUC原理-5.synchronized底层原理

Java对象头 以32位虚拟机为例&#xff1a; 普通对象 在Java虚拟机中&#xff0c;每个对象都有一个对象头&#xff08;Object Header&#xff09;&#xff0c;其中包含了一些用于管理对象的元数据信息。对象头通常由两部分组成&#xff1a;mark word&#xff08;标记字&#x…