# Apriori算法的numpy实现

```#! -*- coding: utf-8 -*-

import numpy as np

class Apriori:

def __init__(self, min_support, min_confidence):
self.min_support = min_support # 最小支持度
self.min_confidence = min_confidence # 最小置信度

def count(self, filename='apriori.txt'):
self.total = 0 # 数据总行数
items = {} # 物品清单

# 统计得到物品清单
with open(filename) as f:
for l in f:
self.total += 1
for i in l.strip().split(','): # 以逗号隔开
if i in items:
items[i] += 1.
else:
items[i] = 1.

# 物品清单去重，并映射到ID
self.items = {i:j/self.total for i,j in items.items() if j/self.total > self.min_support}
self.item2id = {j:i for i,j in enumerate(self.items)}

# 物品清单的0-1矩阵
self.D = np.zeros((self.total, len(items)), dtype=bool)

# 重新遍历文件，得到物品清单的0-1矩阵
with open(filename) as f:
for n,l in enumerate(f):
for i in l.strip().split(','):
if i in self.items:
self.D[n, self.item2id[i]] = True

def find_rules(self, filename='apriori.txt'):
self.count(filename)
rules = [{(i,):j for i,j in self.items.items()}] # 记录每一步的频繁项集
l = 0 # 当前步的频繁项的物品数

while rules[-1]: # 包含了从k频繁项到k+1频繁项的构建过程
rules.append({})
keys = sorted(rules[-2].keys()) # 对每个k频繁项按字典序排序（核心）
num = len(rules[-2])
l += 1
for i in range(num): # 遍历每个k频繁项对
for j in range(i+1,num):
# 如果前面k-1个重叠，那么这两个k频繁项就可以组合成一个k+1频繁项
if keys[i][:l-1] == keys[j][:l-1]:
_ = keys[i] + (keys[j][l-1],)
_id = [self.item2id[k] for k in _]
support = 1. * sum(np.prod(self.D[:, _id], 1)) / self.total # 通过连乘获取共现次数，并计算支持度
if support > self.min_support: # 确认是否足够频繁
rules[-1][_] = support

# 遍历每一个频繁项，计算置信度
result = {}
for n,relu in enumerate(rules[1:]): # 对于所有的k，遍历k频繁项
for r,v in relu.items(): # 遍历所有的k频繁项
for i,_ in enumerate(r): # 遍历所有的排列，即(A,B,C)究竟是 A,B -> C 还是 A,B -> C 还是 A,B -> C ？
x = r[:i] + r[i+1:]
confidence = v / rules[n][x] # 不同排列的置信度
if confidence > self.min_confidence: # 如果某种排列的置信度足够大，那么就加入到结果
result[x+(r[i],)] = (confidence, v)

return sorted(result.items(), key=lambda x: -x[1][0]) # 按置信度降序排列```

```from pprint import pprint

# apriori.txt文件来自 https://github.com/mahaoyang/Apriori-algorithm/blob/master/apriori.txt
model = Apriori(0.06, 0.75)
pprint(model.find_rules('apriori.txt'))```

0 条评论

• ### Python进阶分享

本教程面向有其他编程语言基础的Python初学者和有一定基础寻求进阶的Python学习者

• ### 【CV中的attention机制】

提出scSE模块论文的全称是：《Concurrent Spatial and Channel ‘Squeeze & Excitation’ in Fully C...

• ### 理解情感 ：从 Keras 移植到 pyTorch

情感情绪检测是自然语言理解的关键要素。最近，我们将原来的项目迁移到了新的集成系统上，该系统基于麻省理工学院媒体实验室推出的 NLP 模型搭建而成。

• ### Core ML简介及实时目标检测及Caffe TensorFlow coremltools模型转换

Core ML简介及实时目标检测，Caffe、Tensorflow与Core ML模型转换、Vision库的使用 转载请注明出处 https://cloud.t...

• ### 用Python做一个久坐提醒小助手

整体的构思类似于一个番茄时钟，提供一个倒计时功能并且在完成计时时发出警告。主要分为如下几个模块，一是时间选择模块，二是按钮模块，控制计时开始、暂停以及恢复，三是...

• ### Objective-C MapKit的使用-LBS简单的租车主界面demo效果分析代码demo地址

https://github.com/gongxiaokai/EasyCarDemo

• ### 通过 CONN_MAX_AGE 优化 Django 的数据库连接

上周对我们用Django+Django-rest-framework提供的一套接口进行了压力测试。压测的过程中，收到DBA通知——数据库连接数过多，希望我们优化...