zoukankan      html  css  js  c++  java
  • Apriori——python3实现

      最近看了关联算法中的Apriori没看懂,这次看了一些论文总算看懂了,不过还是没能够自己实现。在github搜到一些代码看,看的不很懂,这里先贴上(当中有自己加的注释),有时间再补充研究。

      

    # -*- coding: utf-8 -*-
    """
    Created on Wed Nov 30 10:05:42 2016
    
    @author: Administrator
    """
    from numpy import *
    import itertools
     
    support_dic = {}
     
    #生成原始数据,用于测试
    def loadDataSet():
        return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
     
    #获取整个数据库中的一阶元素
    # C1 = {1, 2, 3, 4, 5}	
    def createC1(dataSet):
        C1 = set([])
        for item in dataSet:
            C1 = C1.union(set(item))
        return [frozenset([i]) for i in C1]
     
    #输入数据库(dataset) 和 由第K-1层数据融合后得到的第K层数据集(Ck),
    #用最小支持度(minSupport)对 Ck 过滤,得到第k层剩下的数据集合(Lk)
    def getLk(dataset, Ck, minSupport):
        global support_dic
        Lk = {}
        #计算Ck中每个元素在数据库中出现次数
        for item in dataset:
            for Ci in Ck:
                if Ci.issubset(item):
                    if not Ci in Lk:
                        Lk[Ci] = 1
                    else:
                        Lk[Ci] += 1
        #用最小支持度过滤
        Lk_return = []
        for Li in Lk:
            support_Li = Lk[Li] / float(len(dataSet))
            if support_Li >= minSupport:
                Lk_return.append(Li)
                support_dic[Li] = support_Li
        return Lk_return
    
    #将经过支持度过滤后的第K层数据集合(Lk)融合
    #得到第k+1层原始数据Ck1
    '''连接步'''
    def genLk1(Lk):
        Ck1 = []
        for i in range(len(Lk) - 1):
            for j in range(i + 1, len(Lk)):
                if sorted(list(Lk[i]))[0:-1] == sorted(list(Lk[j]))[0:-1]:
                    Ck1.append(Lk[i] | Lk[j])											
        return Ck1
      
    #遍历所有二阶及以上的频繁项集合
    def genItem(freqSet, support_dic):
        for i in range(1, len(freqSet)):
            for freItem in freqSet[i]:
                genRule(freItem)
    
    #输入一个频繁项,根据“置信度”生成规则
    #采用了递归,对规则树进行剪枝
    def genRule(Item, minConf=0.7):
        if len(Item) >= 2:
            for element in itertools.combinations(list(Item), 1):
                if support_dic[Item] / float(support_dic[Item - frozenset(element)]) >= minConf:
                    print(str([Item - frozenset(element)]) + "----->" + str(element))
                    print (support_dic[Item] / float(support_dic[Item - frozenset(element)]))
                    genRule(Item - frozenset(element))
    
    #输出结果
    if __name__ == '__main__':
        dataSet = loadDataSet()
        result_list = []
        Ck = createC1(dataSet)
        #循环生成频繁项集合,直至产生空集
        while True:
            Lk = getLk(dataSet, Ck, 0.5)
            if not Lk:
                break
            result_list.append(Lk)
            Ck = genLk1(Lk)
            if not Ck:
                break
        #输出频繁项及其“支持度”
        print(support_dic)
        #输出规则
        genItem(result_list, support_dic)
    

      输出:

  • 相关阅读:
    webGL 光照
    Go语言入门之指针的使用
    Go语言入门之变量声明
    服务器开启防火墙
    Linux安全之密钥登录
    Mysql优化之my.cnf参数优化
    程序员工作法
    laravel中新增路由文件
    Mysql用户管理(远程连接、授权)
    Laravel通过Swoole提升性能
  • 原文地址:https://www.cnblogs.com/buzhizhitong/p/6129212.html
Copyright © 2011-2022 走看看