RFMP-Growth算法

557 阅读4分钟

写在前面:RFM模型分析在当下已经是非常常见的了,广泛运用与电商或传统商业提高自己的利润总量。什么是RFM模型?即通过分析一个客户的近期购买行为、购买的总体频率以及花费多少钱等3项指标来描述该客户的价值状况。该算法是其中之一参考度是频率,即从最简单也是最容易想到的角度出发,研究如何从客户角度来推销更多产品,而之前学习的挖掘算法都是基于产品的角度。

Discovering valuable frequent patterns based on RFM analysis without customer identification information

样例

基本样例信息

定义

  • 交易项集 T={ti,(x1,qx1),,(xm,qxm}T = \{t_{\rm i}, (x_1, q_{\rm x_1}), \dots, (x_{\rm m}, q_{\rm x_m}\},其中 tt 表示该交易项集发生的时间,xx 表示项(商品),qxjq_{\rm x_j} 表示内部效用(商品购买量)
  • 频繁度分值(Frequency score):相当于以前的支持度 sup(X)sup(X),该文中使用 FScoreDB(X)FScore_{DB}(X) 表示。不同的是,该支持度必须符合 FScore(X)DB×αFScore(X) \ge |DB| \times \alpha 才能把该项集 XX 当作是 FF-patternpattern(其中 α\alpha 是阈值,DB|DB| 表示数据集中包含的总交易项数量)
  • 利润分值(Monetary score):相当于以前的效用值 u(X)u(X),该文中使用 MScore(X,Tj)MScore(X, T_{\rm j}) 表示在交易项 TjT_{\rm j} 中该项集 XX 的利润分值,定义式为 MScore(X,Tj)=xiXXTjp(xi)×qxiMScore(X, T_{\rm j}) = \sum_{\rm x_i \in X \land X \subseteq T_{\rm j}}p(x_{\rm i}) \times q_{\rm x_i}。更进一步,项集 XX 在整个数据集中的利润分值定义为 MScore(X)=TjDBMScore(X) = \sum_{T_{\rm j} \in DB}。当 MScore(X)βMScore(X) \ge \beta 时,我们认定该项集是 MM-patternpattern(其中 β\beta 是设置的阈值)
  • 近期分值(Recency score):在交易项集 TjT_{\rm j} 内,项集 XX 存在,定义为 RScore(X,Tj)=(1δ)timecurrenttimeTjRScore(X, T_{\rm j}) = (1-\delta)^{time_{\rm current}-time_{\rm T_j}}(其中 δ(0,1)\delta \in (0, 1) 是设定的衰减速度),更进一步,项集 XX 在整个数据集中的近期分值定义为 RScore(X)=TjDBRScore(X,Tj)RScore(X) = \sum_{T_{\rm j} \in DB}RScore(X, T_{\rm j})。当 RScore(X)γRScore(X) \ge \gamma 时,我们认定该项集是 RR-patternpattern (其中 γ\gamma 是设定的阈值)

Ps. 当某个项集 XX 满足以上三个度量分值都不小于各自设定的阈值时候,我们认定该项集是 RFMRFM-patternpattern

  • 项集的交易项效用值(Transaction utility)类似于以前的 tu(X,Tj)tu(X, T_{\rm j}),该文中定义为 ta(X,Tj)=xiTjXTjp(xi)×qxita(X, T_{\rm j}) = \sum_{x_{\rm i} \in T_{\rm j} \land X \subseteq T_{\rm j}}p(x_{\rm i}) \times q_{\rm x_i},更进一步,项集 XX 在整个数据集中的总交易项效用值定义为 ttaDB(X)=Tjta(A,Tj)tta_{\rm DB}(X) = \sum_{T_{\rm j}}ta(A, T_{\rm j})

Ps. 当某个项集 XX 满足 FScore(X)DB×αFScore(X) \ge |DB| \times \alphattaDB(X)βtta_{\rm DB}(X) \ge \betaRScoreDB(X)γRScore_{\rm DB}(X) \ge \gamma,那么我们认定该项集是 RFTRFT-patternpattern (类似于使用 TWU 筛选出候选项集,即需要进一步确认的项集)

性质

  1. SRFMSRFMSRFTSRFT 分别代表 RFMRFM-patternpattern 集和 RFTRFT-patternpattern 集,那么有 SRFMSRFTSRFM \subseteq SRFT

    证明:

    根据 MScore(X,Tj),ta(X,Tj)MScore(X, T_{\rm j}), \, ta(X, T_{\rm j}) 的定义,我们很容易得出 xiTjp(xi)×qxixiXp(xi)×qxi\sum_{x_{\rm i} \in T_{\rm j}}p(x_{\rm i}) \times q_{\rm x_i} \ge \sum_{x_{\rm i} \in X}p(x_{\rm i}) \times q_{\rm x_i}(因为 XTjX \subseteq T_{\rm j})进而 ttaDB(X)MScoreDB(X)tta_{\rm DB}(X) \ge MScore_{\rm DB}(X)。可知当项集 XXRFMRFM-patternpattern 时,必然是 RFTRFT-patternpattern

  2. 当一个项集是 RFTRFT-patternpattern,那么它的任何子集依然会是 RFTRFT-patternpattern向下封闭性

    证明:

    设项集 X,XX, \, X'RR-patternpatternFF-patternpattern,且 XXX' \subset X。自然有 TXTXT_{\rm X} \subset T_{\rm X'}(反过来看 XXXX' 的扩展集,那么包含 XX' 的交易项集不一定包含 XX)即 ttaDB(X)ttaDB(X)tta_{\rm DB}(X') \ge tta_{\rm DB}(X),得证

算法

构造 RFM-pattern-tree:

Construct RFM-pattern-tree

构造 RFM-header-tree 伪代码:计算方式和之间计算 1-utility-list 是一样的,一层层遍历交易项 TiT_{\rm i},一层层把本轮遍历计算出来的结果添加到表中,伪代码如下:

algo_RFM-header-table

以下演示根据样例数据集计算,我们假设 α=10%,β=100%,γ=0.95%,δ=0.01%,tcurrent=115\alpha = 10\%, \, \beta = 100\%, \, \gamma = 0.95\%, \, \delta = 0.01\%, t_{\rm current} = 115,遍历 T1T_1 可以得到 RScoreDB(T1)0.315,FScoreDB(T1)=1,ttaDB(T1)=312RScore_{\rm DB}(T_1) \approx 0.315, \, FScore_{\rm DB}(T_1) = 1, \, tta_{\rm DB}(T_1) = 312,即下表:

item-nameRScoreFScorettalink
A0.3151312
B0.3151312
F0.3151312

遍历交易项 T2T_2 可以得到 RScoreDB(T2)0.377,FScoreDB(T2)=1,ttaDB(T2)=164RScore_{\rm DB}(T_2) \approx 0.377, \, FScore_{\rm DB}(T_2) = 1, \, tta_{\rm DB}(T_2) = 164,即下表:

irem-nameRScoreFScorettalink
A0.6922476
B0.6922476
F0.6922476

...依次计算各交易项,最终得到下表(已进行过滤且按照 FScoreFScore 降序排列):

item-nameRScoreFScorettalink
A4.97681059
E4.3046768
C2.5254329
F2.4944679
B1.1583667
D1.7782300

构造 RFM-pattern-tree 伪代码

algo_RFM-pattern-tree

以下演示继续计算,遍历交易项 T1T_1 时,可以得到 RScoreDB(T1)0.315,FScoreDB(T1)=1,ttaDB(T1)=312RScore_{\rm DB}(T_1) \approx 0.315, \, FScore_{\rm DB}(T_1) = 1, \, tta_{\rm DB}(T_1) = 312,分别创建三个子节点:insert_node([A|FB], root, 0.315, 312),insert_node([F|B], A, 0.315, 312),和 insert_node([B|- null], B, 0.315, 312) 排序后如下图(左)所示(Ps. 文中特别强调了在创建节点后需要立即建立相应的索引);遍历交易项 T2T_2 时,可以得到 RScoreDB(T2)0.377,FScoreDB(T2)=1,ttaDB(T2)=164RScore_{\rm DB}(T_2) \approx 0.377, \, FScore_{\rm DB}(T_2) = 1, \, tta_{\rm DB}(T_2) = 164,由于节点已经存在,所以直接相加重新赋值,下图(中)所示;遍历交易项 T3T_3 时,可以得到 RScoreDB(T3)0.393,FScoreDB(T3)=1,ttaDB(T3)=45RScore_{\rm DB}(T_3) \approx 0.393, \, FScore_{\rm DB}(T_3) = 1, \, tta_{\rm DB}(T_3) = 45,因为节点 CCAA 后面,所以新开一条分支,如下图(右)所示:

insert T1 into RFM-pattern-tree insert T2 into RFM-pattern-tree insert T3 into RFM-pattern-tree

...经过多次计算,可以得到最终结果如下图(构造流程也可以参考FPFP-TreeTree):

algo_RFM-pattern-tree_Final

RFMP-growth 算法伪代码:

RFMP-growth algorithm

tree-growth 算法伪代码:

tree-growth algorithm

总结

该算法基于之前的FP-Growth算法改进而成,需要注意的是由于衡量标准的增多,算法在一定程度上需要多次扫描数据集,如何设计一个好的数据结构是比较重要的,再者Up-Growth是对FP-Growth的改进,那么是否能对RFMP-Growth进行改进呢?