某个超市的销售数据中包含了不同商品的购买记录。设计一个程序,使用关联规则算法来发现商品之间的关联关系,即一起购买的频繁项集和关联规则。 要求: 设计一个程序,使用关联规则算法(如Apriori算法)来发现频繁项集和关联规则。 提供必要的输入接口,例如购买记录和最小支持度、最小置信度等参数。 输出频繁项集和关联规则 注:销售数据示例如下: ["牛奶", "面包", "鸡蛋"], ["面包", "黄油"], ["牛奶", "鸡蛋"], ["面包", "黄油"], ["牛奶", "面包", "黄油", "鸡蛋"], ["面包", "鸡蛋"], ["牛奶", "面包", "黄油"], ["牛奶", "鸡蛋"], ["牛奶", "面包", "黄油", "鸡蛋"], ["牛奶", "面包", "黄油"]
时间: 2023-07-05 10:24:58 浏览: 46
好的,我可以为您提供一个 Python 实现的 Apriori 算法,用于发现频繁项集和关联规则。以下是一个示例代码:
```python
from collections import defaultdict
from itertools import combinations
def get_frequent_itemsets(transactions, support, min_length=1, max_length=None):
"""
生成频繁项集
:param transactions: 交易记录
:param support: 最小支持度
:param min_length: 最小长度
:param max_length: 最大长度
:return: 频繁项集
"""
item_counts = defaultdict(int)
for trans in transactions:
for item in trans:
item_counts[item] += 1
items = set(item_counts.keys())
frequent_itemsets = set()
length = 1
while True:
new_frequent_itemsets = set()
if max_length and length > max_length:
break
for itemset in combinations(items, length):
support_count = sum([1 for trans in transactions if set(itemset).issubset(set(trans))])
support_rate = support_count / len(transactions)
if support_rate >= support:
frequent_itemsets.add(itemset)
new_frequent_itemsets.add(itemset)
length += 1
if not new_frequent_itemsets:
break
items = set.union(*new_frequent_itemsets)
return frequent_itemsets
def get_association_rules(frequent_itemsets, transactions, confidence):
"""
生成关联规则
:param frequent_itemsets: 频繁项集
:param transactions: 交易记录
:param confidence: 最小置信度
:return: 关联规则
"""
association_rules = []
for itemset in frequent_itemsets:
if len(itemset) > 1:
for i in range(1, len(itemset)):
for antecedent in combinations(itemset, i):
consequent = set(itemset) - set(antecedent)
antecedent_count = sum([1 for trans in transactions if set(antecedent).issubset(set(trans))])
consequent_count = sum([1 for trans in transactions if set(consequent).issubset(set(trans))])
support_count = sum([1 for trans in transactions if set(itemset).issubset(set(trans))])
confidence_rate = support_count / antecedent_count
if confidence_rate >= confidence:
association_rules.append((antecedent, consequent, support_count, confidence_rate))
return association_rules
# 示例数据
transactions = [
["牛奶", "面包", "鸡蛋"],
["面包", "黄油"],
["牛奶", "鸡蛋"],
["面包", "黄油"],
["牛奶", "面包", "黄油", "鸡蛋"],
["面包", "鸡蛋"],
["牛奶", "面包", "黄油"],
["牛奶", "鸡蛋"],
["牛奶", "面包", "黄油", "鸡蛋"],
["牛奶", "面包", "黄油"]
]
# 获取频繁项集
frequent_itemsets = get_frequent_itemsets(transactions, 0.3, 1)
print("Frequent Itemsets:")
for itemset in frequent_itemsets:
print(itemset)
# 获取关联规则
association_rules = get_association_rules(frequent_itemsets, transactions, 0.7)
print("Association Rules:")
for rule in association_rules:
antecedent = ",".join(rule[0])
consequent = ",".join(rule[1])
support = rule[2]
confidence = rule[3]
print(f"{antecedent} => {consequent} (support: {support}, confidence: {confidence})")
```
在上面的代码中,我们使用了 `get_frequent_itemsets` 函数来生成频繁项集,该函数接受三个参数:交易记录 `transactions`、最小支持度 `support` 和最小长度 `min_length`(默认为 1)。在函数内部,我们先统计每个商品的出现次数,然后逐步生成长度为 1、2、3 等的候选项集,并根据支持度过滤掉不满足最小支持度的项集,最终得到频繁项集。
然后,我们使用 `get_association_rules` 函数来生成关联规则,该函数接受三个参数:频繁项集 `frequent_itemsets`、交易记录 `transactions` 和最小置信度 `confidence`。在函数内部,我们遍历所有的频繁项集,对于每个频繁项集,我们生成它的所有子集,并把剩余的部分作为关联规则的后件,计算置信度并过滤掉不满足最小置信度的规则,最终得到关联规则。
在示例代码中,我们使用了 Apriori 算法来生成频繁项集,输出了最小支持度为 0.3 的频繁项集,并使用了最小置信度为 0.7 来生成关联规则。您可以根据需要修改这些参数,并使用您自己的数据来调用这些函数。