关联规则算法疑问:R语言Apriori结果与教材结论不符
问题根源分析与解决方案
首先得说,你这里大概率是混淆了频繁项集和关联规则的概念,再加上代码参数的默认设置,才导致和预期结果不一样。咱们一步步捋:
1. 先理清核心概念
你提到的《数据挖掘:概念与技术》里说的{I1, I2, I3}和{I1, I2, I5},其实是频繁项集——也就是满足最小支持度的项的集合,没有前提和结论之分。而关联规则是形如X→Y的蕴含式,必须同时满足最小支持度和最小置信度,X是前提项集,Y是结论项集,两者不相交。
2. 你的R代码问题在哪
你用的apriori()函数,默认的target参数是"rules",也就是生成关联规则,而不是频繁项集。你的代码只指定了support=0.02和minlen=3,但confidence默认是0.8,所以代码在找满足这三个条件的关联规则,而不是你想要的频繁项集。
咱们拿你的交易数据算一下:
- 总共有9条交易,
{I1,I2,I3}出现2次,支持度≈0.222;{I1,I2,I5}也出现2次,支持度≈0.222,都远高于0.02。 - 但如果要生成关联规则,比如
{I1,I2}→{I3},它的置信度是支持度({I1,I2,I3})/支持度({I1,I2}) = (2/9)/(4/9)=0.5,远低于0.8的阈值,所以这个规则不会被筛选出来;同理{I1,I2}→{I5}的置信度也是0.5,同样不满足条件。你看到的{I1,I2,I5}应该是规则里的完整项集展示,而非真正的规则形式。
3. 修正代码得到预期结果
如果你想验证书里的频繁项集,只需要修改代码,指定生成频繁项集即可:
transactions <- read.transactions("file.csv", sep=",") # 指定target为"frequent itemsets",生成频繁项集 m1 <- apriori(transactions, parameter = list(support=0.02, minlen=3, target="frequent itemsets")) inspect(sort(m1, by="support"))
运行这段代码后,你就能看到{I1,I2,I3}和{I1,I2,I5}这两个频繁项集了,完全符合书里的描述。
如果你的目标确实是生成关联规则,那得接受:在你的交易数据里,没有置信度≥0.8且包含这两个项集的规则——毕竟置信度的计算要求前提项集出现时,结论项集必须大概率出现,而你的数据里I1,I2同时出现时,I3或I5只占一半的情况,达不到0.8的要求。
内容的提问来源于stack exchange,提问作者zb111
相关产品推荐
相关产品推荐

