题目: 某个超市的销售数据中包含了不同商品的购买记录。设计一个程序,使用关联规则算法来发现商品之间的关联关系,即一起购买的频繁项集和关联规则。 要求: 设计一个程序,使用关联规则算法(如Apriori算法)来发现频繁项集和关联规则。 提供必要的输入接口,例如购买记录和最小支持度、最小置信度等参数。 输出频繁项集和关联规则 注:销售数据示例如下: ["牛奶", "面包", "鸡蛋"], ["面包", "黄油"], ["牛奶", "鸡蛋"], ["面包", "黄油"], ["牛奶", "面包", "黄油", "鸡蛋"], ["面包", "鸡蛋"], ["牛奶", "面包", "黄油"], ["牛奶", "鸡蛋"], ["牛奶", "面包", "黄油", "鸡蛋"], ["牛奶", "面包", "黄油"]
时间: 2023-07-05 13:24:51 浏览: 172
以下是使用Python实现的关联规则算法(Apriori算法)的代码,实现了频繁项集和关联规则的发现:
```python
from itertools import combinations
from collections import defaultdict
def frequent_itemsets(transactions, support):
"""
生成频繁项集
:param transactions: 所有的交易记录
:param support: 最小支持度
:return: 频繁项集及其支持度
"""
item_counts = defaultdict(int)
for transaction in transactions:
for item in transaction:
item_counts[item] += 1
n = len(transactions)
freq_itemsets = {}
for item, count in item_counts.items():
if count / n >= support:
freq_itemsets[(item,)] = count / n
k = 2
while freq_itemsets:
new_itemsets = {}
for itemset in freq_itemsets:
for item in item_counts:
if item not in itemset:
new_itemset = tuple(sorted(itemset + (item,)))
if new_itemset not in new_itemsets:
new_itemsets[new_itemset] = 0
if all(x in transactions for x in new_itemset):
new_itemsets[new_itemset] += 1
freq_itemsets = {itemset: count / n for itemset, count in new_itemsets.items() if count / n >= support}
if freq_itemsets:
yield freq_itemsets
k += 1
def association_rules(itemsets, confidence):
"""
生成关联规则
:param itemsets: 所有的频繁项集
:param confidence: 最小置信度
:return: 关联规则及其置信度
"""
for k, freq_itemsets in enumerate(itemsets):
if k < 1:
continue
for itemset in freq_itemsets:
for i in range(1, len(itemset)):
for antecedent in combinations(itemset, i):
antecedent = tuple(sorted(antecedent))
consequent = tuple(sorted(set(itemset) - set(antecedent)))
confidence_value = freq_itemsets[itemset] / freq_itemsets[antecedent]
if confidence_value >= confidence:
yield antecedent, consequent, confidence_value
# 销售数据
transactions = [
["牛奶", "面包", "鸡蛋"],
["面包", "黄油"],
["牛奶", "鸡蛋"],
["面包", "黄油"],
["牛奶", "面包", "黄油", "鸡蛋"],
["面包", "鸡蛋"],
["牛奶", "面包", "黄油"],
["牛奶", "鸡蛋"],
["牛奶", "面包", "黄油", "鸡蛋"],
["牛奶", "面包", "黄油"]
]
# 最小支持度和最小置信度
min_support = 0.3
min_confidence = 0.7
# 生成频繁项集
itemsets = list(frequent_itemsets(transactions, min_support))
for i, itemset in enumerate(itemsets):
print('频繁{}项集:'.format(i+1))
for items, support in itemset.items():
print('{}:{:.2%}'.format(', '.join(items), support))
# 生成关联规则
rules = list(association_rules(itemsets, min_confidence))
for antecedent, consequent, confidence in rules:
print('{} => {}:{:.2%}'.format(', '.join(antecedent), ', '.join(consequent), confidence))
```
在上述代码中,我们首先定义了一个函数`frequent_itemsets()`来生成频繁项集,使用了Apriori算法。该函数的输入参数包括销售数据`transactions`和最小支持度`support`,输出结果为频繁项集及其支持度。该函数会返回多个频繁项集,其中每个频繁项集都是一个字典,键为项集,值为支持度。
接着,我们定义了另一个函数`association_rules()`来生成关联规则。该函数的输入参数包括所有频繁项集`itemsets`和最小置信度`confidence`,输出结果为关联规则及其置信度。该函数会遍历所有频繁项集,对于每个频繁项集,遍历所有可能的前件和后件,计算置信度并输出满足最小置信度的关联规则。
最后,我们使用了上述两个函数来处理销售数据,并设置了最小支持度为0.3,最小置信度为0.7。输出了所有的频繁项集及其支持度,以及满足最小置信度的关联规则及其置信度。
阅读全文