1、综述
关联分析的目的是寻找交易记录中的频繁项集和关联规则。
置信度:set{e1,e2,e3,...}等一起出现的概率
支持度:set{e1,e2,e3...}发生时set{en,em,...}也发生的概率
在频繁项集中寻找关联规则???why?? 置信度和支持度的大小关系??
2、实现思想
a、将item进行排列组合生成各种长度的项集set,满足支持度要求的项集为频繁项集;
b、apriori算法减小了候选项;
c、Fp-Growth算法只需要两次遍历数据库:(1):找出len-1的频繁项集;(2):利用len-1的项集建立FP-Tree
3、apriori实现
# -*- coding:utf8 -*-
__author__ = 'zhangpeng'
def loadDataSet():
return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
# 生成len-1的候选项集列表C1
def createC1(dataSet):
C1 = []
# 把len-1的不重复item加入C1中
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
# 把c1中每个item变成frozenset集合
return map(frozenset,C1)
# 从len-k的候选项集列表Ck中选出频繁项集列表Lk
def scanD(D,Ck,minSupport):
ssCnt = {}
# 遍历数据集和len-k的候选集
for transaction in D:
for item in Ck:
# set集合运算,判断transaction_set中是否包含item_set
if transaction.issuperset(item):
if not ssCnt.has_key(item):
ssCnt[item] = 1
else:
ssCnt[item] += 1
numItems = float(len(D))
retList = []
supportData = {}
# 保留大于支持度的item_set
for key in ssCnt:
support = ssCnt[key]/numItems
if support >= minSupport:
retList.append(key)
supportData[key] = support
return retList,supportData
# 从len-(k-1)的频繁项集列表Lk_1中生成len-k的候选项集列表Ck
def aprioriGen(Lk_1,k):
retList = []
lenLk_1 = len(Lk_1)
for i in range(lenLk_1):
for j in range(i + 1, lenLk_1):
# 如果两个项集前k-2个元素相同,则合并成len-k的list
temp = frozenset(Lk_1[i] | Lk_1[j])
if len(temp) == k and temp not in retList:
retList.append(temp)
return retList
# 寻找dataSet的频繁项集
def apriori(dataSet, minSupport = 0.5):
C1 = createC1