用python实现apriori算法
时间: 2023-05-31 12:19:49 浏览: 226
### 回答1:
Apriori算法是一种常用的关联规则挖掘算法,可以用于发现数据集中的频繁项集。Python可以很方便地实现Apriori算法,具体步骤如下:
1. 导入所需的库:numpy、pandas
2. 定义函数load_data(),用于读取数据集
3. 定义函数create_C1(),用于生成候选项集C1
4. 定义函数scan_D(),用于从候选项集中筛选出频繁项集Lk
5. 定义函数apriori(),用于生成所有的频繁项集
6. 定义函数generate_rules(),用于生成关联规则
7. 调用函数apriori()和generate_rules(),输出结果
具体实现细节可以参考以下代码:
import numpy as np
import pandas as pd
def load_data():
data = pd.read_csv('data.csv', header=None)
return data.values.tolist()
def create_C1(data):
C1 = []
for transaction in data:
for item in transaction:
if [item] not in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
def scan_D(data, Ck, min_support):
support_count = {}
for transaction in data:
for item in Ck:
if item.issubset(transaction):
if item not in support_count:
support_count[item] = 1
else:
support_count[item] += 1
num_items = float(len(data))
Lk = []
support_data = {}
for item in support_count:
support = support_count[item] / num_items
if support >= min_support:
Lk.append(item)
support_data[item] = support
return Lk, support_data
def apriori(data, min_support=.5):
C1 = create_C1(data)
D = list(map(set, data))
L1, support_data = scan_D(D, C1, min_support)
L = [L1]
k = 2
while len(L[k-2]) > :
Ck = generate_Ck(L[k-2], k)
Lk, support_k = scan_D(D, Ck, min_support)
support_data.update(support_k)
L.append(Lk)
k += 1
return L, support_data
def generate_Ck(Lk, k):
Ck = []
len_Lk = len(Lk)
for i in range(len_Lk):
for j in range(i+1, len_Lk):
L1 = list(Lk[i])[:k-2]
L2 = list(Lk[j])[:k-2]
L1.sort()
L2.sort()
if L1 == L2:
Ck_item = Lk[i] | Lk[j]
if not has_infrequent_subset(Ck_item, Lk, k-1):
Ck.append(Ck_item)
return Ck
def has_infrequent_subset(Ck_item, Lk, k):
for item in Ck_item:
subset = Ck_item - frozenset([item])
if subset not in Lk:
return True
return False
def generate_rules(L, support_data, min_confidence=.7):
rules = []
for i in range(1, len(L)):
for freq_set in L[i]:
H1 = [frozenset([item]) for item in freq_set]
if i > 1:
rules_from_conseq(freq_set, H1, support_data, rules, min_confidence)
else:
calc_confidence(freq_set, H1, support_data, rules, min_confidence)
return rules
def calc_confidence(freq_set, H, support_data, rules, min_confidence=.7):
pruned_H = []
for conseq in H:
conf = support_data[freq_set] / support_data[freq_set - conseq]
if conf >= min_confidence:
print(freq_set - conseq, '-->', conseq, 'conf:', conf)
rules.append((freq_set - conseq, conseq, conf))
pruned_H.append(conseq)
return pruned_H
def rules_from_conseq(freq_set, H, support_data, rules, min_confidence=.7):
m = len(H[])
if len(freq_set) > (m + 1):
Hmp1 = generate_Ck(H, m+1)
Hmp1 = calc_confidence(freq_set, Hmp1, support_data, rules, min_confidence)
if len(Hmp1) > 1:
rules_from_conseq(freq_set, Hmp1, support_data, rules, min_confidence)
data = load_data()
L, support_data = apriori(data, min_support=.5)
rules = generate_rules(L, support_data, min_confidence=.7)
print('频繁项集:', L)
print('支持度:', support_data)
print('关联规则:', rules)
### 回答2:
Apriori算法是一种常用的关联规则挖掘算法,它的主要设计思想是由低阶的频繁项集产生高阶的频繁项集,进而生成关联规则。在这个过程中,只有满足最小支持度的频繁项集才能被选中,形成的关联规则才有较高的可靠性。
Python是一种高效、易于学习和实现的编程语言,因此在实现Apriori算法时,我们可以采用Python编写代码。下面是一个简单的Apriori算法实现过程:
首先,我们定义一个函数来读取数据集。数据集格式为每行多个词,词与词之间需要用空格隔开。
def loadDataSet():
return [['beer', 'nuts', 'diaper'],
['beer', 'coffee', 'diaper'],
['beer', 'diaper', 'nuts'],
['beer', 'nuts', 'coffee', 'diaper'],
['diaper', 'nuts', 'coffee'],]
接着,我们定义一个辅助函数,用于从数据集中生成初级项集。
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset, C1)
然后,我们定义一个函数来扫描数据集,统计初级项集的支持度。统计过程中,我们需要设置一个最小支持度threshold,只有超过这个最小支持度的频繁项集才会被保留。
def scanD(D, Ck, minSupport):
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if not can in ssCnt: ssCnt[can]=1
else: ssCnt[can] += 1
numItems = float(len(D))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key]/numItems
if support >= minSupport:
retList.insert(0,key)
supportData[key] = support
return retList, supportData
接下来,我们定义一个函数来生成所有的频繁项集。在实现过程中,我们需要利用初级项集生成次级项集,再利用次级项集生成更高阶的频繁项集,依次推导。
def aprioriGen(Lk, k):
retList = []
lenLk = len(Lk)
for i in range(lenLk):
for j in range(i+1, lenLk):
L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]
L1.sort(); L2.sort()
if L1==L2:
retList.append(Lk[i] | Lk[j])
return retList
最后,我们定义一个函数来实现完整的Apriori算法,包括读取数据集、生成初级项集、迭代生成频繁项集的过程,并返回所有的频繁项集及其支持度。
def apriori(dataSet, minSupport = 0.5):
C1 = createC1(dataSet)
D = map(set, dataSet)
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
以上就是一个简单的Apriori算法的Python实现过程。利用这个代码,我们可以轻松地处理大规模数据集,挖掘出其中的频繁项集和关联规则,并为决策提供科学依据。
### 回答3:
Apriori算法是一种经典的频繁项集挖掘算法,常用于关联规则挖掘领域。该算法通过生成候选项集、计算频数、剪枝等步骤,逐步发现数据集中的频繁项集。
用Python实现Apriori算法,具体的步骤可以分为如下:
1. 数据预处理。将原始数据转化为适合Apriori算法处理的格式,即事务列表。事务列表是由多个项组成的集合,每一项表示一个不同的元素或属性。例如,一个超市购物历史数据可以表示为以下形式:
```
[
['面包', '蛋糕', '可乐'],
['面包', '牛奶', '啤酒'],
['面包', '蛋糕', '牛奶', '啤酒'],
['蛋糕', '牛奶', '啤酒'],
['蛋糕', '可乐']
]
```
2. 生成候选项集。通过扫描事务列表,生成大小为1的频繁项集。再利用频繁项集的性质,利用集合的并集和交集产生更大的候选项集。
3. 计算候选项集的支持度。扫描事务列表,统计每个候选项集出现的次数,即支持度。可以使用Python中的collections.Counter计算出每个项集的计数。
4. 利用支持度剪枝。根据预先设定的最小支持度阈值,剪除支持度不达标的候选项集。从频繁1项集开始,逐步产生频繁K项集,直到无法生成新的频繁项集为止。
5. 从候选项集中产生关联规则。关联规则是由前项与后项组成,如A->B。对于每个频繁项集,枚举其子集,检查每个子集的置信度是否达到最小置信度阈值。可以使用Python中的 itertools.combinations()生成所有长度为K-1的子集。
Python代码实现可以参考如下:
```python
from itertools import combinations
from collections import Counter
def load_data(data):
"""
将原始数据转化为事务列表
"""
transaction_list = []
for row in data:
transaction = set(row)
transaction_list.append(transaction)
return transaction_list
def get_frequent_items(transactions, min_sup):
"""
生成频繁项集
"""
item_counts = Counter(item for transaction in transactions for item in transaction)
frequent_items = {}
for item, count in item_counts.items():
if count >= min_sup:
frequent_items[item] = count
k = 1
while frequent_items:
candidate_items = generate_candidates(frequent_items, k)
item_counts = Counter()
for transaction in transactions:
for candidate in candidate_items:
if candidate.issubset(transaction):
item_counts[candidate] += 1
frequent_items = {}
for item, count in item_counts.items():
if count >= min_sup:
frequent_items[item] = count
k += 1
return frequent_items
def generate_candidates(frequent_items, k):
"""
生成候选项集
"""
return set([item1.union(item2) for item1 in frequent_items for item2 in frequent_items if len(item1.union(item2))==k])
def generate_rules(frequent_items, min_conf):
"""
生成关联规则
"""
rules = {}
for itemset in frequent_items.keys():
if len(itemset) < 2:
continue
for item in itemset:
antecedent = frozenset([item])
consequent = itemset - antecedent
conf = frequent_items[itemset] / frequent_items[antecedent]
if conf >= min_conf:
rules[antecedent, consequent] = conf
return rules
if __name__ == '__main__':
data = [
['面包', '蛋糕', '可乐'],
['面包', '牛奶', '啤酒'],
['面包', '蛋糕', '牛奶', '啤酒'],
['蛋糕', '牛奶', '啤酒'],
['蛋糕', '可乐']
]
min_sup = 2
min_conf = 0.6
transactions = load_data(data)
frequent_items = get_frequent_items(transactions, min_sup)
rules = generate_rules(frequent_items, min_conf)
for rule, conf in rules.items():
antecedent, consequent = rule
print('{} => {}, conf={:.2f}'.format(antecedent, consequent, conf))
```
以上就是用Python实现Apriori算法的基本步骤和代码,实现的过程中需要注意调整项集的数据类型,以及设置合适的最小支持度和最小置信度阈值。通过这种方法,可以方便快捷地挖掘关联规则的规律,发现数据集中蕴含的深层次信息。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)