使用apriori算法进行关联分析

  关联分析:从大规模数据集中寻找物品之间的隐含关系。目标包括两项:发现频繁项集和发现关联规则

  主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索方法并不能解决这个问题。

一、关联分析

  {尿布与啤酒}

  Apriori算法

    优点:易编码实现

    缺点:在大数据上可能较慢

    适用数据类型:数值型或者标称型数据

  频繁项集(frequent item sets)是指那些经常出现在一起的物品集合

    一个项集的支持度被定义为数据集中包含该项集的记录所占的比例。

    可信度或置信度是针对一条诸如{尿布}->{葡萄酒}的关联规则来定义的

  支持度和可信度是用来量化关联分析是否成功的方法。假设想找到支持度大于0.8的所有项集,应该如何去做?一个方法是生成一个物品所有可能组合的清单,计算量大

  Apriori算法

二、Apriori原理

  我们对那些经常在一起被购买的商品非常感兴趣

  一般过程:

    收集数据:使用任意方法

    准备数据:任何数据类型都可以,因为我们只保存集合

    分析数据:使用任意方法

    训练算法:使用Apriori算法来找到频繁项集

    测试算法:不需要测试过程

    使用算法:用于发现频繁项集以及物品之间的关联规则

  Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。这个原理直观上并没有什么帮助,但是如果反过来看就有用了,也就是说如果一个项集是非频繁集,那么它的所有超集也是非频繁的

  Apriori算法是发现频繁项集的一种方法。Apriori算法的两个输入参数分别是最小支持度和数据集

import numpy as np 

def loadDataSet():
	return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

def createC1(dataSet):
	C1 = []
	for transaction in dataSet:
		for item in transaction:
			if not [item] in C1:
				C1.append([item])
	C1.sort()
	return map(frozenset, C1)

def scanD(D, Ck, minSupport):
	ssCnt = {}
	for tid in D:
		for can in Ck:
			if can.issubset(tid):
				if not ssCnt.has_key(can): ssCnt[can]=1
			else: ssCnt[can] += 1
	numItems = float(len(D)) 
	retList = [] #
	supportData = {}
	for key in ssCnt:
		support = ssCnt[key]/numItems
		if support >= minSupport:
			retList.insert(0, key)
		supportData[key] = support #
	return retList, supportData

dataSet=loadDataSet()
print(dataSet)
C1=createC1(dataSet)
print(C1)
D=map(set,dataSet)
print(D)
L1,suppoData0=scanD(D,C1,0.5)
print(L1)

def aprioriGen(Lk, k):
	retList = []
	lenLk = len(Lk)
	for i in range(lenLk):
		for j in range(i+1, lenLk):
			L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]
			L1.sort(); L2.sort()
			if L1==L2: #if first k-2 elements are equal
				retList.append(Lk[i] | Lk[j])
	return retList

def apriori(dataSet, minSupport=0.5):
	C1 = createC1(dataSet)
	D = map(set, dataSet)
	L1, supportData = scanD(D, C1, minSupport)
	L = [L1]
	k = 2
	while (len(L[k-2]) > 0):
		Ck = aprioriGen(L[k-2], k)
		Lk, supK = scanD(D, Ck, minSupport) #scan DB to get Lk
		supportData.update(supK)
		L.append(Lk)
		k += 1
	return L, supportData


四、从频繁项集中挖掘关联规则

  上一节介绍如何使用Apriori算法来发现频繁项集,现在需要解决的问题是如何找出关联规则

  要找到关联规则,我们首先从一个频繁项集开始。如果有一个频繁项集{豆奶,莴笋},那么就可能有一条关联规则“豆奶->莴笋”。

  那一条规则P->H的可信度定义为support(P | H) / support(P)。

def generateRules(L, supportData, minConf=0.7):
	bigRuleList = []
	for i in range(1, len(L)):
		for freqSet in L[i]:
			H1 = [frozenset([item]) for item in freqSet]
			if (i > 1):
				rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
			else:
				calcConf(freqSet, H1, supportData, bigRuleList, minConf)
	return bigRuleList

def calcConf(freqSet, H, supportData, br1, minConf=0.7):
	prunedH = []
	for conseq in H:
		conf = supportData[freqSet]/supportData[freqSet-conseq]
		if conf >= minConf:
			print freqSet-conseq, '-->', conseq, 'conf:', conf
			br1.append(conseq)
	return prunedH

def rulesFromConseq(freqSet, H, supportData, br1, minConf=0.7):
	m = len(H[0])
	if (len(freqSet) > (m+1)):
		Hmp1 = aprioriGen(H, m+1)
		Hmp1 = calcConf(freqSet, Hmp1, supportData, br1, minConf)
		if (len(Hmp1) > 1):
			rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)


五、示例:发现国会投票中的模式

  数据集:加州大学埃文分校的机器学习数据集合中有一个自1984年起的国会投票记录的数据集:http://archive.ics.uci.edu/ml/datasets/Congressional+Voting+Records

  想尝试一些更新的数据,目前有不少组织致力于将政府数据公开化,其中的一个组织是智能投票工程(Project Vote Smart, http://www.votesmart.org),它提供了一个公共的API,




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值