专栏首页快乐学PythonApriori算法的numpy实现

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学习者

    马哥Python
  • Standalone Selenium Server/RemoteWebdriver 使用代理

    马哥Python
  • pandas导出excel出现 df.to_excel() UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in positio...

    马哥Python
  • 【CV中的attention机制】

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

    BBuf
  • 理解情感 :从 Keras 移植到 pyTorch

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

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

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

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

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

    老肥码码码
  • 如何用pyTorch改造基于Keras的MIT情感理解模型

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

    https://github.com/gongxiaokai/EasyCarDemo

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

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

    the5fire

扫码关注云+社区

领取腾讯云代金券