基于关联规则的推荐算法详解(Apriori 、FP−Growth)

本文深入探讨关联规则分析及FP-Growth算法在数据挖掘中的应用,详细讲解Apriori算法原理,以及如何利用FP-Tree优化频繁项集生成,提高推荐系统效率。
    关联规则分析也是一种比较常见的推荐算法,主要是根据历史数据统计不同规则出现的关系,比如:X−>Y X->YX−>Y,表示X XX事件发生后,Y YY事件也会有一定概率发生。

关联规则分析最著名的就是“啤酒-尿布”的经典案例,沃尔玛的超市管理人员通过数据发现,很多买尿布的人大概率事件会去购买啤酒。这是因为在美国很多妈妈在家带孩子,所以去超市买尿布的任务就交给了爸爸,而一般爸爸都会在买尿布的时候顺手买一罐啤酒喝,所以明明是不相关的两个东西就有了很大的关联。
  
  关联规则分析的最终目标就是要找出强关联规则。一般使用Apriori 、FP−Growth、 Eclat算法。这里我们主要分析一下Apriori 。

Apriori算法

Apriori算法是生成频繁集的一种算法。Apriori原理有个重要假设,如果某个项集是频繁的,那么它的所有子集势必也是频繁的。如果一个项集是非频繁项集,那么它所对应的超集就全都是非频繁项集。传统的Apriori算法的计算量很大,当商品数据量大时基本上效率很低,所以后来有FP-Tree算法优化了该算法。

在电商平台中,常用的关联规则应用是单品推荐单品,即一般只需要知道频繁2项集即可。而且商品并不是全部平等销售的,组合、搭售、买赠、企业采购等订单都会影响频繁集的生成,若仅用支持度衡量物品之间的关联性,很容易导致出现假性关联。

在关联规则中,因为支持度表示在历史中A和B同时购买的概率,置信度表示A推荐B的可信程度。由此可以采用提升度=支持度(Support)*置信度(Confidence )的方式来表示A推荐B而A和B同时购买的概率。这样相比于单纯使用支持度更全面,同时避免了支持度中等或置信度中等的关联规则被淘汰。
在这里插入图片描述

  • 实例分析

假设用户会同时购买多个手机,我们就不管手机用途了,送人也好,买了摔也行,我们搜集了下面四个用户的购买记录:
  在这里插入图片描述
假设我们的最小支持度为0.5,最小置信度为0.75。首先计算最少个数项集的支持度在这里插入图片描述
因为最小支持度为0.5,所以 {XR} 不符合,直接被剔除。将项集个数增加一位,如果拓展项集有子集{XR} ,直接去掉。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

置信度

表示了这条规则有多大程度上值得可信。设条件的项的集合为A,结果的集合为B。置信度计算在A中,同时也含有B的概率。即Confidence(A==>B)=P(B|A)。例 如计算"如果Orange则Coke"的置信度。

支持度

计算在所有的交易集中,既有A又有B的概率。

计算每个规则的支持度,置信度,提升度。首先作变量声明:

f->i 表示具备特征f的用户购买商品i的事件
sf,i 表示规则f->i的支持度
cf,i 表示规则f->i的置信度

sf,i 计算方法为:统计表3中同时满足特征=f,商品=i,用户是否购买=0的记录条数记为
规则选择,规则可以通过以下条件进行过滤。
在这里插入图片描述
条件1:大于等于某个值,参考值取20-100。
条件2:对所有规则的支持度做降序,取75位数为参考值,sf,i>=这个值。
条件3:对所有规则的置信度做降序,取75位数为参考值,cf,i>=这个值。

Step4:给用户推荐商品

给定一个用户u和一个商品i,通过上述方法生成用户u的特征集合记为F. 我们用该用户特征集合下,所有对i有效特征的均值衡量用户u对该物品的购买可能性p(u,i):
在这里插入图片描述
通过上述公式对全库商品求top 10得分的商品推荐给用户。在实际计算当中,并非会进行全库计算,而是采用特征索引技术进行减少大量冗余计算。

代码

import sys

from itertools import chain, combinations
from collections import defaultdict
from optparse import OptionParser


def subsets(arr):
    """ Returns non empty subsets of arr"""
    return chain(*[combinations(arr, i + 1) for i, a in enumerate(arr)])


def returnItemsWithMinSupport(itemSet, transactionList, minSupport, freqSet):
        """calculates the support for items in the itemSet and returns a subset
       of the itemSet each of whose elements satisfies the minimum support"""
        _itemSet = set()
        localSet = defaultdict(int)

        for item in itemSet:
                for transaction in transactionList:
                        if item.issubset(transaction):
                                freqSet[item] += 1
                                localSet[item] += 1

        for item, count 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值