数据挖掘关联算法代码实现
时间: 2023-09-18 22:15:59 浏览: 43
关联算法是数据挖掘中非常重要的一种算法,常用于市场篮子分析、商品推荐等场景。下面是一个简单的关联算法的代码实现,使用的是Apriori算法:
```python
def load_data(file_path):
"""
从文件中读取数据,每行数据用空格隔开
:param file_path: 文件路径
:return: 数据列表
"""
data = []
with open(file_path, 'r') as f:
for line in f:
data.append(line.strip().split())
return data
def create_c1(data):
"""
创建候选项集C1,即所有可能的一项集
:param data: 数据列表
:return: 候选项集C1
"""
c1 = []
for transaction in data:
for item in transaction:
if not [item] in c1:
c1.append([item])
c1.sort()
return list(map(frozenset, c1))
def scan_data(data, ck, min_support):
"""
在数据集中寻找满足最小支持度的项集
:param data: 数据列表
:param ck: 候选项集列表
:param min_support: 最小支持度
:return: 满足最小支持度的项集列表和项集支持度字典
"""
support_dict = {}
for transaction in data:
for item in ck:
if item.issubset(transaction):
support_dict[item] = support_dict.get(item, 0) + 1
num_items = float(len(data))
ret_list = []
support_data = {}
for key in support_dict:
support = support_dict[key] / num_items
if support >= min_support:
ret_list.insert(0, key)
support_data[key] = support
return ret_list, support_data
def apriori_gen(lk, k):
"""
根据频繁项集lk生成候选项集Ck+1
:param lk: 频繁项集列表
:param k: 项集元素个数
:return: 候选项集列表
"""
ret_list = []
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:
ret_list.append(lk[i] | lk[j])
return ret_list
def apriori(data, min_support=0.5):
"""
Apriori算法实现
:param data: 数据列表
:param min_support: 最小支持度
:return: 频繁项集列表和项集支持度字典
"""
c1 = create_c1(data)
d = list(map(set, data))
l1, support_data = scan_data(d, c1, min_support)
l = [l1]
k = 2
while len(l[k - 2]) > 0:
ck = apriori_gen(l[k - 2], k)
lk, sup_k = scan_data(d, ck, min_support)
support_data.update(sup_k)
l.append(lk)
k += 1
return l, support_data
```
使用示例:
```python
data = load_data('data.txt')
L, support_data = apriori(data, 0.5)
print('频繁项集:', L)
print('项集支持度:', support_data)
```
其中,`data.txt`文件中存放的是数据集,每行数据用空格隔开。函数`apriori`的第二个参数`min_support`表示最小支持度阈值,可以根据实际情况适当调整。输出结果中,`频繁项集`表示所有满足最小支持度的频繁项集,`项集支持度`表示每个频繁项集的支持度。