PCY算法对products数据集的关联规则挖掘
时间: 2023-07-09 14:45:57 浏览: 58
PCY算法是一种经典的频繁项集挖掘算法,可以用于快速发现大规模数据集中的频繁项集。下面我们将以products数据集为例,介绍如何使用PCY算法进行关联规则挖掘。
products数据集包含了10,000个交易记录,每个交易记录包含了1到4个商品。首先,我们需要将数据集转换为事务列表,每个事务表示一个交易记录,包含了该交易记录中出现的所有商品。
```python
import pandas as pd
# 加载数据集
data = pd.read_csv('products.csv', header=None)
# 转换为事务列表
transactions = []
for i in range(len(data)):
transaction = set(data.iloc[i])
transactions.append(transaction)
```
然后,我们可以使用PCY算法对事务列表进行关联规则挖掘。PCY算法的基本步骤如下:
1. 计算每个项的出现次数,筛选出所有出现次数大于等于支持度阈值的项,并将这些项作为候选项集。
```python
from collections import Counter
# 计算每个项的出现次数
item_counts = Counter([item for transaction in transactions for item in transaction])
# 筛选出所有出现次数大于等于支持度阈值的项
min_support = 0.01
frequent_items = [item for item, count in item_counts.items() if count/len(transactions) >= min_support]
```
2. 构建哈希表,用于计算候选项集的支持度。
```python
# 构建哈希表
bucket_size = 100
hash_table = [0] * bucket_size
for transaction in transactions:
for i, item1 in enumerate(frequent_items):
if item1 in transaction:
for j, item2 in enumerate(frequent_items[i+1:]):
if item2 in transaction:
# 使用hash函数计算哈希值
hash_value = (hash(item1+item2) % bucket_size)
hash_table[hash_value] += 1
```
3. 统计每个候选项集的支持度,筛选出所有支持度大于等于支持度阈值的频繁项集。
```python
# 统计每个候选项集的支持度
candidate_counts = [0] * len(frequent_items)
for transaction in transactions:
for i, item1 in enumerate(frequent_items):
if item1 in transaction:
for j, item2 in enumerate(frequent_items[i+1:]):
if item2 in transaction:
# 使用hash函数计算哈希值
hash_value = (hash(item1+item2) % bucket_size)
if hash_table[hash_value] >= min_support * len(transactions):
candidate_counts[i] += 1
candidate_counts[j+i+1] += 1
# 筛选出所有支持度大于等于支持度阈值的频繁项集
frequent_itemsets = []
for i, item in enumerate(frequent_items):
if candidate_counts[i]/len(transactions) >= min_support:
frequent_itemsets.append((item,))
```
4. 使用频繁项集生成关联规则,并计算置信度。
```python
# 使用频繁项集生成关联规则
rules = []
for i, itemset in enumerate(frequent_itemsets):
if len(itemset) > 1:
for j in range(len(itemset)):
# 生成左部和右部
left = itemset[:j] + itemset[j+1:]
right = itemset[j:j+1]
confidence = candidate_counts[frequent_items.index(itemset)] / candidate_counts[frequent_items.index(left)]
if confidence >= min_confidence:
rules.append((left, right, confidence))
```
在实际应用中,需要根据具体问题和数据集的特点,选择合适的支持度和置信度阈值,以得到更好的关联规则。