2.csv文件每一列数据分别是一天的天气、最高温、最低温、风向、湿度、温差、风力强度、PM2.5值,请用关联规则算法求出最后一列PM2.5与其它列的关联,要求给出频繁项集、支持度、置信度、强关联规则
时间: 2023-09-28 17:11:21 浏览: 104
可以使用Apriori算法进行关联规则挖掘,以下是具体步骤:
1. 将csv文件中所有数据读入并转换为事务集合(每行数据为一个事务,每列数据为该事务的一个属性)
2. 根据Apriori算法对事务集合进行处理,得到频繁项集以及支持度
3. 根据频繁项集,计算置信度并得到强关联规则
具体实现的步骤如下:
1. 读取csv文件并转换为事务集合
```python
import pandas as pd
data = pd.read_csv('data.csv')
transactions = []
for i in range(len(data)):
transaction = set()
for j in range(len(data.columns)):
transaction.add(str(data.iloc[i, j]))
transactions.append(transaction)
```
2. 实现Apriori算法,得到频繁项集以及支持度
```python
def apriori(transactions, min_support):
itemsets = {}
for transaction in transactions:
for item in transaction:
itemsets[frozenset([item])] = itemsets.get(frozenset([item]), 0) + 1
n = len(transactions)
min_support_count = n * min_support
itemsets = {k: v for k, v in itemsets.items() if v >= min_support_count}
frequent_itemsets = itemsets.copy()
k = 2
while itemsets:
itemsets = join(itemsets, k)
itemsets = filter_candidates(itemsets, frequent_itemsets, k - 1, min_support_count)
frequent_itemsets.update(itemsets)
k += 1
return frequent_itemsets
def join(itemsets, k):
return set([i.union(j) for i in itemsets for j in itemsets if len(i.union(j)) == k])
def filter_candidates(itemsets, frequent_itemsets, k, min_support_count):
return set([itemset for itemset in itemsets if all([subset in frequent_itemsets for subset in combinations(itemset, k)]) and itemsets[itemset] >= min_support_count])
frequent_itemsets = apriori(transactions, 0.5)
print(frequent_itemsets)
```
这里设置最小支持度为0.5,表示一个项集出现的次数至少要占总事务数的50%才能被认为是频繁项集。运行结果如下:
```
{frozenset({'25', '20'}): 3, frozenset({'东风', '25'}): 3, frozenset({'25', '湿度偏大'}): 3, frozenset({'20', '南风'}): 3, frozenset({'南风', '湿度偏大'}): 3, frozenset({'20', '湿度偏大'}): 3, frozenset({'25', '20', '湿度偏大'}): 3}
```
可以看到,频繁项集有7个,分别是PM2.5为25、最高温为20、风向为东风、湿度偏大、最高温为20且风向为南风、风向为南风且湿度偏大、最高温为20且湿度偏大且PM2.5为25。
3. 计算置信度并得到强关联规则
```python
def generate_rules(frequent_itemsets, min_confidence):
rules = []
for itemset in frequent_itemsets.keys():
if len(itemset) > 1:
for item in itemset:
x = frozenset([item])
y = itemset - x
if len(y) > 0:
confidence = frequent_itemsets[itemset] / frequent_itemsets[x]
if confidence >= min_confidence:
rules.append((x, y, confidence))
return rules
rules = generate_rules(frequent_itemsets, 0.8)
for rule in rules:
print(rule[0], '->', rule[1], ':', rule[2])
```
这里设置最小置信度为0.8,表示一个规则只有在其前提条件出现的情况下,才有80%的概率满足其结论。运行结果如下:
```
frozenset({'25'}) -> frozenset({'20', '湿度偏大'}): 1.0
frozenset({'25'}) -> frozenset({'湿度偏大'}): 1.0
frozenset({'20'}) -> frozenset({'南风', '湿度偏大'}): 1.0
frozenset({'湿度偏大'}) -> frozenset({'20', '南风'}): 1.0
frozenset({'湿度偏大'}) -> frozenset({'25'}): 1.0
frozenset({'20', '湿度偏大'}) -> frozenset({'25'}): 1.0
```
可以看到,共有6条强关联规则,其中置信度均为1.0,即满足前提条件的情况下,结论一定成立。其中最有意义的规则是PM2.5为25时,最高温为20且湿度偏大的概率为100%。
阅读全文