apriori算法python实现 csv,并且将结果频繁项集的支持度和置信度可视化
时间: 2024-03-12 20:49:18 浏览: 57
以下是使用Python实现Apriori算法并从CSV文件读取数据的示例代码。此外,使用matplotlib库将频繁项集的支持度和置信度绘制成图表。
```python
import csv
import itertools
from collections import defaultdict
import matplotlib.pyplot as plt
# 从CSV文件中读取数据
def load_data(file_path):
data = []
with open(file_path, 'r') as csvfile:
csvreader = csv.reader(csvfile)
for row in csvreader:
data.append(row)
return data
# 获取所有单项集
def get_itemset(data):
itemset = set()
for row in data:
for item in row:
itemset.add(item)
return itemset
# 获取所有频繁项集和它们的支持度
def get_frequent_itemset(data, min_support):
itemset = get_itemset(data)
itemset_support = defaultdict(int)
for row in data:
for item in itemset:
if item in row:
itemset_support[item] += 1
frequent_itemset = set()
frequent_itemset_support = {}
for item in itemset:
if itemset_support[item]/len(data) >= min_support:
frequent_itemset.add(frozenset([item]))
frequent_itemset_support[frozenset([item])] = itemset_support[item]/len(data)
k = 2
while True:
candidate_itemset = set([i.union(j) for i in frequent_itemset for j in frequent_itemset if len(i.union(j)) == k])
if not candidate_itemset:
break
candidate_itemset_support = defaultdict(int)
for row in data:
for item in candidate_itemset:
if item.issubset(row):
candidate_itemset_support[item] += 1
frequent_itemset = set([itemset for itemset in candidate_itemset if candidate_itemset_support[itemset]/len(data) >= min_support])
for itemset in frequent_itemset:
frequent_itemset_support[itemset] = candidate_itemset_support[itemset]/len(data)
k += 1
return frequent_itemset, frequent_itemset_support
# 获取所有规则和它们的支持度和置信度
def get_rules(frequent_itemset, frequent_itemset_support, min_confidence):
rules = []
for itemset in frequent_itemset:
if len(itemset) > 1:
for i in range(1, len(itemset)):
for antecedent in itertools.combinations(itemset, i):
consequent = itemset.difference(antecedent)
if antecedent in frequent_itemset and consequent in frequent_itemset:
confidence = frequent_itemset_support[itemset]/frequent_itemset_support[antecedent]
if confidence >= min_confidence:
rules.append((antecedent, consequent, frequent_itemset_support[itemset], confidence))
return rules
# 绘制频繁项集的支持度和置信度图表
def plot_support_confidence(frequent_itemset_support, rules, min_support, min_confidence):
sorted_frequent_itemset_support = sorted(frequent_itemset_support.items(), key=lambda x: x[1], reverse=True)
sorted_rules = sorted(rules, key=lambda x: x[3], reverse=True)
plt.bar(range(len(sorted_frequent_itemset_support)), [support for itemset, support in sorted_frequent_itemset_support], color='b', alpha=0.5)
plt.xticks(range(len(sorted_frequent_itemset_support)), [','.join(itemset) for itemset, support in sorted_frequent_itemset_support], rotation=90)
plt.xlabel('Itemset')
plt.ylabel('Support')
plt.title(f'Frequent itemsets and rules (minimum support = {min_support}, minimum confidence = {min_confidence})')
ax2 = plt.twinx()
ax2.bar(range(len(sorted_rules)), [confidence for antecedent, consequent, support, confidence in sorted_rules], color='r', alpha=0.5)
ax2.set_ylabel('Confidence')
plt.show()
# 测试代码
data = load_data('transactions.csv')
min_support = 0.5
min_confidence = 0.5
frequent_itemset, frequent_itemset_support = get_frequent_itemset(data, min_support)
rules = get_rules(frequent_itemset, frequent_itemset_support, min_confidence)
plot_support_confidence(frequent_itemset_support, rules, min_support, min_confidence)
```
在此示例代码中,我们首先使用 `load_data` 函数从CSV文件中读取数据。然后,我们使用 `get_frequent_itemset` 函数获取所有频繁项集和它们的支持度。接下来,我们使用 `get_rules` 函数获取所有规则和它们的支持度和置信度。最后,我们使用 `plot_support_confidence` 函数将频繁项集的支持度和置信度绘制成图表。
请注意,此示例代码假定CSV文件中的每个项目都是单个项,并用逗号分隔。如果您的CSV文件格式有所不同,您可能需要调整代码以适应您的数据格式。
阅读全文