python中Apriori算法实现讲解

作者:三年一梦 时间:2023-10-27 17:41:20 

本文主要给大家讲解了Apriori算法的基础知识以及Apriori算法python中的实现过程,以下是所有内容:

1. Apriori算法简介

Apriori算法是挖掘布尔关联规则频繁项集的算法。Apriori算法利用频繁项集性质的先验知识,通过逐层搜索的迭代方法,即将K-项集用于探察(k+1)项集,来穷尽数据集中的所有频繁项集。先找到频繁项集1-项集集合L1, 然后用L1找到频繁2-项集集合L2,接着用L2找L3,知道找不到频繁K-项集,找到每个Lk需要一次数据库扫描。注意:频繁项集的所有非空子集也必须是频繁的。Apriori性质通过减少搜索空间,来提高频繁项集逐层产生的效率。Apriori算法由连接和剪枝两个步骤组成。

2. Apriori算法步骤

 根据一个实例来解释:下图是一个交易单,I1至I5可看作5种商品。下面通过频繁项集合来找出关联规则。

假设我们的最小支持度阈值为2,即支持度计数小于2的都要删除。

python中Apriori算法实现讲解        

上表第一行(第一项交易)表示:I1和I2和I5一起被购买。

python中Apriori算法实现讲解

C1至L1的过程: 只需查看支持度是否高于阈值,然后取舍。上图C1中所有阈值都大于2,故L1中都保留。

python中Apriori算法实现讲解

L1至C2的过程分三步:

遍历产生L1中所有可能性组合,即(I1,I2)...(I4,I5 )    对便利产生的每个组合进行拆分,以保证频繁项集的所有非空子集也必须是频繁的。即对于(I1,I2)来说进行拆分为I1,I2.由于I1和I2在L1中都为频繁项,所以这一组合保留。对于剩下的C2根据原数据集中进行支持度计数

python中Apriori算法实现讲解

C2至L2的过程: 只需查看支持度是否高于阈值,然后取舍。

python中Apriori算法实现讲解

L2至C3的过程:

还是上面的步骤。首先生成(1,2,3)、(1,2,4)、(1,2,5)....为什么最后只剩(1,2,3)和(1,2,5)呢?因为剪枝过程:(1,2,4)拆分为(1,2)和(1,4)和(2,4).然而(1,4)在L2中不存在,即非频繁项。所有剪枝删除。然后对C3中剩下的组合进行计数。发现(1,2,3)和(1,2,5)的支持度2。迭代结束。

所以算法过程就是 Ck - Lk - Ck+1 的过程:

3.Apriori算法实现

# -*- coding: utf-8 -*-"""Created on Sat Dec 9 15:33:45 2017@author: LPS"""import numpy as npfrom itertools import combinations # 迭代工具data = [[1,2,5], [2,4], [2,3], [1,2,4], [1,3], [2,3], [1,3], [1,2,3,5], [1,2,3]]minsp = 2d = []for i in range(len(data)): d.extend(data[i])new_d = list(set(d))def satisfy(s, s_new, k): # 更新确实存在的L  e =[] ss_new =[] for i in range(len(s_new)):  for j in combinations(s_new[i], k): # 迭代产生所有元素可能性组合   e.append(list(j))  if ([l for l in e if l not in s]) ==[] :   ss_new.append(s_new[i])  e = []  return ss_new # 筛选满足条件的结果 def count(s_new): # 返回narray格式的C num = 0 C = np.copy(s_new) C = np.column_stack((C, np.zeros(C.shape[0]))) for i in range(len(s_new)):  for j in range(len(data)):   if ([l for l in s_new[i] if l not in data[j]]) ==[] :    num = num+1  C[i,-1] = num  num = 0    return Cdef limit(L): # 删掉不满足阈值的C row = [] for i in range(L.shape[0]):  if L[i,-1] < minsp :   row.append(i) L = np.delete(L, row, 0)  return Ldef generate(L, k): # 实现由L至C的转换 s = [] for i in range(L.shape[0]):  s.append(list(L[i,:-1])) s_new = []# L = L.delete(L, -1, 1)# l = L.shape[1] for i in range(L.shape[0]-1):  for j in range(i+1, L.shape[0]):   if (L[j,-2]>L[i,-2]):    t = list(np.copy(s[i]))    t.append(L[j,-2])    s_new.append(t) # s_new为列表     s_new = satisfy(s, s_new, k)  C = count(s_new) return C# 初始的C与LC = np.zeros([len(new_d), 2])for i in range(len(new_d)): C[i:] = np.array([new_d[i], d.count(new_d[i])])L = np.copy(C)L = limit(L)# 开始迭代k = 1while (np.max(L[:,-1]) > minsp): C = generate(L, k) # 由L产生C L = limit(C)  # 由C产生L k = k+1# 对最终结果去重复print((list(set([tuple(t) for t in L])))# 结果为 [(1.0, 2.0, 3.0, 2.0), (1.0, 2.0, 5.0, 2.0)]

来源:https://www.cnblogs.com/king-lps/p/8013036.html

标签:python,Apriori算法
0
投稿

猜你喜欢

  • 分享vim python缩进等一些配置

    2022-09-28 00:12:55
  • 如何解决客户机页面刷新时连接不上数据库问题?

    2009-12-16 18:24:00
  • pygame实现俄罗斯方块游戏(基础篇3)

    2022-10-10 10:45:54
  • python实现Decorator模式实例代码

    2022-05-10 06:04:56
  • python计算程序开始到程序结束的运行时间和程序运行的CPU时间

    2023-08-04 02:11:09
  • linux修改mysql数据库文件的路径

    2024-01-19 20:50:42
  • php floor()函数案例详解

    2023-06-14 16:13:03
  • Python数据可视化之matplotlib.pyplot绘图的基本参数详解

    2022-06-10 12:19:48
  • 使用js 设置url参数

    2024-04-28 09:50:48
  • nodejs实现简单的gulp打包

    2024-05-11 10:16:22
  • Python标准库uuid模块(生成唯一标识)详解

    2023-07-04 14:03:05
  • 解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程

    2023-05-17 04:25:43
  • 用户体验如何提升阿里巴巴的商业价值

    2009-07-23 20:29:00
  • 十几行的超简日历组件(兼容FF)js源码

    2010-08-08 08:49:00
  • golang中如何保证精度的方法

    2024-04-26 17:23:22
  • js multiple全选与取消全选实现代码

    2024-04-28 10:19:36
  • golang中package is not in GOROOT报错的真正解决办法

    2024-04-28 10:45:29
  • Python列表的索引与切片

    2022-11-17 13:06:19
  • go语言中linkname的用法

    2024-02-07 10:48:39
  • python优雅实现代码与敏感信息分离的方法

    2022-05-07 18:21:14
  • asp之家 网络编程 m.aspxhome.com