关联规则

一、一些概念

关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系有两种形式:

  • 频繁项集:经常出现在一块的物品的集合。
  • 关联规则:物品之间存在的关系。

  • 支持度:数据集中包含该项集的记录所占的比例。
  • 置信度:支持度({尿布、啤酒})/支持度({尿布})。


箭头左边是前件,箭头后面是后件

二、Apriori

  • 发现频繁项集
    如果某个项集是频繁的,它的所有子集也是频繁的。如果一个项集是非频繁集,它的所有超集也是非频繁集。分为两步:连接步和剪枝步。
  • 挖掘关联规则
    如果某条规则不满足最小可信度要求,那么该规则的所有子集也不满足。

三、聚类算法和关联规则区别

同:

  • 都是无监督学习。
  • 都可以把物品聚成一类一类。

异:

  • 聚类是把相似的聚在一类,不同类中的不相似。
  • 关联规则关注的不是相似度,而是因果关系,关联关系,频繁项集中的物品不是相似,而是总是一起出现。

四、关联规则高级用法

  • 穿衣搭配推荐:预测给定商品的搭配商品集合。
  • 依据用户轨迹的商户精准营销:对用户推送符合该用户画像的商户位置和其他优惠信息。
  • 电子商务搭配购买推荐。
  • 基于兴趣的实时新闻推荐:同一个用户浏览的不同新闻的内容之间会存在一定的相似性和关联。
  • 银行金融客户交叉销售分析:通过对购买数据分析,发现交叉销售的机会。
  • 交通事故成因分析:事故类型、事故人员、事故车辆、事故天气、驾照信息、驾驶人员犯罪记录数据以及其他数据,分析交通事故成因。

五、代码

def createC1(dataSet):
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    return list(map(frozenset, C1))

def scanD(D, Ck, minSupport):
    ssCnt = {}
    for tid in D:
        for can in Ck:
            if can.issubset(tid):
                if not can in ssCnt:
                    ssCnt[can]=1
                else:
                    ssCnt[can] += 1
    numItems = float(len(D))
    retList = []
    supportData = {}
    for key in ssCnt:
        support = ssCnt[key] / numItems
        if support >= minSupport:
            retList.append(key)
        supportData[key] = support
    return retList, supportData

def aprioriGen(Lk, k): #creates Ck
    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: #if first k-2 elements are equal
                retList.append(Lk[i] | Lk[j]) #set union
    return retList

# 获得频繁项集的主函数
def apriori(dataSet, minSupport = 0.001):
    C1 = createC1(dataSet)      #扫描所有dataSet,找到包含的所有item,放到C1中,每个item都搞成一个frozen set
    D = list(map(set, dataSet)) #D中是所有的事务,每一个搞成一个set
    L1, supportData = scanD(D, C1, minSupport)  #返回C1中所有符合要求的L1,supportData记录了每一项的支持度
    L = [L1]
    k = 2
    while (len(L[-1]) > 0):
        print(k)
        Ck = aprioriGen(L[-1], k)    #返回所有的组合
        Lk, supK = scanD(D, Ck, minSupport) #scan DB to get Lk
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L, supportData
# 获得频繁项集的主函数
def apriori(dataSet, minSupport = 0.001):
    C1 = createC1(dataSet)      #扫描所有dataSet,找到包含的所有item,放到C1中,每个item都搞成一个frozen set
    D = list(map(set, dataSet)) #D中是所有的事务,每一个搞成一个set
    L1, supportData = scanD(D, C1, minSupport)  #返回C1中所有符合要求的L1,supportData记录了每一项的支持度
    L = [L1]
    k = 2
    while (len(L[-1]) > 0):
        print(k)
        Ck = aprioriGen(L[-1], k)    #返回所有的组合
        Lk, supK = scanD(D, Ck, minSupport) #scan DB to get Lk
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L, supportData

def generateRules(L, supportData, minConf=0.01):  #supportData is a dict coming from scanD
    bigRuleList = []
    for i in range(1, len(L)):#only get the sets with two or more items
        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, supportData, brl, minConf=0.7):
    prunedH = [] #create new list to return
    for conseq in H:
        conf = supportData[freqSet]/supportData[freqSet-conseq] #calc confidence
        if conf >= minConf: 
            print(freqSet-conseq,'-->',conseq,'conf:',conf)
            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)): #try further merging
        Hmp1 = aprioriGen(H, m+1)#create Hm+1 new candidates
        Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
        if (len(Hmp1) > 1):    #need at least two sets to merge
            rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)

def pntRules(ruleList, itemMeaning):
    for ruleTup in ruleList:
        for item in ruleTup[0]:
            print(itemMeaning[item])
        print("           -------->")
        for item in ruleTup[1]:
            print(itemMeaning[item])
        print("confidence: %f" % ruleTup[2])
        print       #print a blank line
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值