Apriori算法是經典的關聯規則挖掘算法,用于從事務型數據庫中發現頻繁項集和強關聯規則,特別常用于購物籃分析等場景。
🧠 核心思想(Apriori原則)
一個項集是頻繁的,前提是它的所有子集也必須是頻繁的。
即:“若某項集不頻繁,它的超集也一定不頻繁”。
這個原則用于大大減少候選項集的數量,提高挖掘效率。
🚶 Apriori算法執行步驟
下面是算法流程(以最小支持度為前提):
① 掃描數據庫,找出所有頻繁1項集(L1)
-
統計每個單個商品出現的次數
-
丟掉那些支持度小于最小閾值的項
② 生成候選2項集(C2),計算頻繁2項集(L2)
-
將L1中的元素兩兩組合成C2
-
掃描數據庫計算這些組合的支持度
-
保留滿足最小支持度的組合,得到L2
③ 使用 L2 構造 C3,找出 L3……
-
重復步驟直到沒有更多頻繁項集為止
④ 基于頻繁項集生成關聯規則
-
從每個頻繁項集中拆分出可能的規則A?B
-
計算這些規則的置信度和提升度
-
篩選滿足置信度和提升度閾值的規則
? 示例(簡化版)
事務如下:
事務ID | 商品列表 |
---|---|
T1 | 牛奶, 面包 |
T2 | 牛奶, 尿布, 啤酒 |
T3 | 面包, 尿布, 可樂 |
T4 | 牛奶, 面包, 尿布 |
T5 | 面包, 啤酒 |
最小支持度設為 0.4(2次出現)
-
L1:頻繁1項集:{牛奶}, {面包}, {尿布}, {啤酒} ?({可樂}只出現1次,刪除)
-
C2(候選2項集):組合上面頻繁1項集,比如 {牛奶, 面包}, {尿布, 啤酒} 等
-
L2:選出支持度 ≥0.4 的組合,如 {牛奶, 面包}, {尿布, 啤酒}(若滿足)
-
L3:組合L2項集再繼續下去……
-
對頻繁項集,如 {牛奶, 尿布} 生成關聯規則:
-
例如 牛奶 ? 尿布,計算置信度 = 支持(牛奶和尿布) / 支持(牛奶)
-
📦 應用場景
-
零售行業的購物籃分析
-
推薦系統(推薦某個商品時同時推薦相關聯商品)
-
醫療診斷中發現藥物組合
-
Web日志分析(用戶點擊路徑)
好的!下面是使用 Python 和 mlxtend
庫來實現 Apriori 算法的完整示例。這個庫簡潔高效,適合教學和實踐。
? 步驟一:安裝依賴(如尚未安裝)
pip install mlxtend
? 步驟二:準備事務數據
我們使用“啤酒與尿布”的經典示例:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder# 示例數據
dataset = [['牛奶', '面包'],['牛奶', '尿布', '啤酒'],['面包', '尿布', '可樂'],['牛奶', '面包', '尿布'],['面包', '啤酒']
]# 轉換為0/1編碼的DataFrame
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
print(df)
輸出:
啤酒 可樂 尿布 牛奶 面包
0 False False False True True
1 True False True True False
2 False True True False True
3 False False True True True
4 True False False False True
? 步驟三:使用 Apriori 算法找出頻繁項集
from mlxtend.frequent_patterns import apriori# 設定最小支持度為0.4(即至少2次)
frequent_itemsets = apriori(df, min_support=0.4, use_colnames=True)
print(frequent_itemsets)
輸出示例:
support itemsets
0 0.6 {面包}
1 0.6 {尿布}
2 0.6 {牛奶}
3 0.4 {啤酒}
4 0.4 {牛奶, 面包}
5 0.4 {牛奶, 尿布}
6 0.4 {尿布, 面包}
? 步驟四:生成關聯規則
from mlxtend.frequent_patterns import association_rules# 使用置信度最小值篩選規則
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.6)
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
輸出示例:
antecedents consequents support confidence lift
0 {牛奶} {面包} 0.4 0.67 1.11
1 {面包} {牛奶} 0.4 0.67 1.11
2 {牛奶} {尿布} 0.4 0.67 1.11
? 總結
-
頻繁項集 通過
apriori()
計算,保留支持度高的組合; -
關聯規則 通過
association_rules()
生成,評估置信度、提升度等; -
可調整
min_support
和min_threshold
控制挖掘深度。