顾客的交易记录可以用一个的矩阵来表示,如果第个顾客购买了第个商品,矩阵的第行第列就为 1,否则为 0。
接下来定义 3 个新概念:association、support 和 confidence。
一个 association 可以用来表示,其中和都是商品的集合,。
一个商品集合的 support 是指交易记录中包含这些商品的交易的个数。一个 association 的 support 是指的 support。
一个 association 的 confidence 是指的 support 除以的 support。
所谓 association 问题就是,给定一个交易记录和两个常数和,希望找到所有的 association,满足其 support 且 confidence 。
总的算法可以分成两步:第一步是找到所有满足 support 的商品集合,第二步是在第一步的基础上再找出满足条件的 association。
这个过程中最困难的是第一步,因为可以证明第一步是 NP-hard 的。
假设我们已经找到了 support 的商品集合的集合,那么最终结果可以表示为:
S_2 = \{ X \to Y \backslash X | X, Y \in S_1 \land X \subsetneq Y \land \\ \text{confidence}(X \to Y \backslash X) \ge K_2 \}
也就是说,枚举中的任意两个商品集合和,如果且的 confidence ,那么就将添加到最终结果的集合中。
假设有个商品,把我们最终要得到的 support 的商品集合的集合记作(large 的意思)。Apriori 算法的思路是把分拆成个集合,其中是中元素个数为的商品集合的集合。Apriori 算法会依次寻找,直到为止。
要想求出是非常容易的,因此接下来只需要解决如何根据求出。当然我们可以直接用暴力枚举的方法求,但是这样速度太慢。我们需要考虑如何利用更快地求出。
Apriori 算法的核心是利用了以下性质:如果,那么。根据这个性质,如果,那么其任意子集也必定 。
因此,求之前,可以先根据这个必要条件筛选掉一些不可能的商品集合。将筛选后的集合记作(candidate 的意思),则有
C_{i+1} = \{X|\forall a \in X, X\backslash {a} \in L_i \}
上面的公式只是数学描述,实际算法实现可以这么做:首先将中的每个商品集合中的商品按照一定顺序排序。然后枚举,若只有最后一个商品不同,其他都相同,则检查是否满足上述必要条件,若满足则加入中。
求出之后,还要再查询交易记录,看看中哪些是真的满足 support 的,就可以求出了。
除了上面介绍的 Apriori 算法,还有 FP-Growth 等经典的算法。