python使用Apriori算法进行关联性解析

作者:开贰锤 时间:2022-08-15 13:02:10 

从大规模数据集中寻找物品间的隐含关系被称作关联分析或关联规则学习。过程分为两步:1.提取频繁项集。2.从频繁项集中抽取出关联规则。

频繁项集是指经常出现在一块的物品的集合。
关联规则是暗示两种物品之间可能存在很强的关系。
一个项集的支持度被定义为数据集中包含该项集的记录所占的比例,用来表示项集的频繁程度。支持度定义在项集上。
可信度或置信度是针对一条诸如{尿布}->{葡萄酒}的关联规则来定义的。这条规则的可信度被定义为“支持度({尿布,葡萄酒})/支持度({尿布})”。

寻找频繁项集

Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的。反过来,如果一个项集是非频繁项集,那么它的所有超集也是非频繁的。

Apriori算法是发现频繁项集的方法。该算法首先生成所有单个物品的项集列表,接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的项集会被去除掉。然后对剩下来的集合进行组合以生成包含两个元素的项集。接下来重新扫描交易记录,去掉不满足最小支持度的项集,该过程重复进行直到所有项集都被去掉。
Apriori伪代码

当列表中项的个数大于0时:
    检查数据以确认每个项集都是频繁的
    保留频繁项集并构建k+1项组成的候选项集的列表

从频繁项集中挖掘关联规则

当可信度大于最小可信度时,可以认为是含有关联规则的。可以观察到,如果某条规则不满足最小可信度要求,那么该规则的所有子集也不会满足最小可信度要求。
可以首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部只包含一个元素,然后对这些规则进行测试,接下来合并,通过合并所有剩余规则右部来创建新的规则列表,其中规则右部包含两个元素,以此类推。

每个频繁项集:
    while(len(L)>1)
        (k规则列表)
        满足最小置信度
        创建k+1规则

整体代码:


import numpy as np
def loadDataSet():
 return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

def createC1(dateSet):
 c1 = []
 for line in dateSet:
   for item in line:
     if not [item] in c1:
       c1.append([item])
 c1.sort()
 return list(map(frozenset,c1))

def scanData(data,ck,minSupport):#寻找满足最小支持度的项集
 ssCnt = {}
 for tid in data:
   for can in ck:
     if can.issubset(tid):
       if can not in ssCnt.keys():
         ssCnt[can] = 0
       ssCnt[can] += 1
 numItems = len(data)
 retList = []
 supportData = {}
 for key in ssCnt.keys():
   support = ssCnt[key]/numItems
   if support >= minSupport:
     retList.append(key)
   supportData[key] = support
 return retList,supportData

def aprioriGen(Lk,k): #根据k-1项集生成k项集
 retList = []
 lenLk = len(Lk)
 for i in range(lenLk):
   for j in range(i+1,lenLk):
     l1 = list(Lk[i])[:k-2]
     l2 = list(Lk[j])[:k-2]
     l1.sort()
     l2.sort()
     if l1 == l2:
       retList.append(Lk[i] | Lk[j])
 return retList

def apriori(dataSet,minSupport = 0.5):#生成频繁项集
 c1 = createC1(dataSet)
 D = list(map(set,dataSet))
 l1,supportData = scanData(D,c1,minSupport)
 L = [l1]
 k = 2
 while(len(L[k-2])>0):
   ck = aprioriGen(L[k-2],k)
   lk,supk = scanData(D,ck,minSupport)
   k = k + 1
   L.append(lk)
   supportData.update(supk)
 return L,supportData
def generaterRules(L,supportData,minConf=0.7):#生成规则
 bigRuleList = []
 for i in range(1,len(L)):
   for freqSet in L[i]:
     H1 = [frozenset([item]) for item in freqSet]
     if i>1:
       rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
     else:
       calcConf(freqSet,H1,supportData,bigRuleList,minConf)
 return bigRuleList
def calcConf(freqSet,H,suppurtData,brl,minConf = 0.7):#计算满足置信度的规则
 prunedH = []
 for conseq in H:
   conf = suppurtData[freqSet]/suppurtData[freqSet-conseq]
   if conf > minConf:
     brl.append((freqSet-conseq,conseq,conf))
     prunedH.append(conseq)
 return prunedH

def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):#递归生成规则
 m = len(H[0])
 if len(freqSet)>=(m+1):
   Hmp1 = calcConf(freqSet,H,supportData,brl,minConf)
   if (len(Hmp1) > 1):
     Hmp1 = aprioriGen(Hmp1,m+1)
     rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)

data = [line.split() for line in open('mushroom.dat').readlines()]
L,support = apriori(data,minSupport=0.3)
for i in range(len(L)):
 for item in L[i]:
   if item & {'2'}:
     print(item)

代码及数据集下载:Apriori

来源:http://blog.csdn.net/weixin_37895339/article/details/78650100

标签:python,Apriori
0
投稿

猜你喜欢

  • System.Runtime.InteropServices.COMException的解决方法

    2023-07-18 15:03:27
  • Python 获取div标签中的文字实例

    2023-03-27 01:53:53
  • ASP也使用ORM,给ASP上所有的SQL注入画上句号

    2011-04-03 11:02:00
  • 在微信小程序中获取用户位置的详细过程

    2024-04-29 13:43:02
  • Python解析器Cpython的GIL解释器锁工作机制

    2021-07-11 18:15:10
  • Keras:Unet网络实现多类语义分割方式

    2022-02-26 16:36:49
  • php短视频源码之瀑布流分割线左右间距问题及解决代码

    2023-06-12 00:27:07
  • 2020年10款优秀的Python第三方库,看看有你中意的吗?

    2021-01-03 10:35:08
  • python实现点对点聊天程序

    2023-10-27 11:42:02
  • python绘制神器五角星+小黄人+樱花

    2022-02-11 03:45:27
  • 安装mysql 8.0.17并配置远程访问的方法

    2024-01-25 06:58:24
  • jQuery渐变发光导航菜单的实例代码

    2024-04-09 19:47:36
  • python使用pil生成图片验证码的方法

    2022-03-08 18:39:24
  • js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结

    2024-04-28 09:49:10
  • 一文带你深入了解Python中的二次移动平均法

    2021-08-30 00:28:12
  • JavaScript/jQuery实现切换页面效果

    2024-04-22 22:23:17
  • Python实现获取sonarqube数据

    2023-02-26 04:38:30
  • 详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案

    2024-04-29 13:25:38
  • Python同时处理多个异常的方法

    2021-12-24 11:20:56
  • asp利用aspjpeg给图片生成PNG透明水印

    2009-03-20 14:01:00
  • asp之家 网络编程 m.aspxhome.com