您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页关联分析-Python

关联分析-Python

来源:测品娱乐

Aprior底层代码原理

def deco(func):
    def inner():
        print('running inner()')
        return inner
def createc1(dataset):  # 定义一个函数来创建1-项集的候选集
    C1 = []  # 初始化一个空列表来存放1-项集
    for transaction in dataset:  # 遍历数据集中的每一个事务
        print(transaction)  # 输出当前事务,用于调试
        for item in transaction:  # 遍历当前事务中的每一个项
            print(item)  # 输出当前项,用于调试
            if [item] not in C1:  # 检查当前项是否已经在候选集中
                C1.append([item])  # 如果不在,则将其添加到候选集中
    C1.sort()  # 对候选集进行排序
    # 将列表转换为不可变集合(frozenset),以便可以作为字典的键使用
    return list(map(frozenset, C1)) 
D=[['A','C','D'],['B',"C",'E'],['A','B','C','D'],['B','E']]
D1=createc1(D)
D1






def aprioriGen(Lk, k):  # 定义一个函数来生成候选的k项集
    retList = []  # 初始化一个空列表来存放生成的候选k项集
    lenLk = len(Lk)  # 获取频繁k-1项集的数量
    for i in range(lenLk):  # 遍历频繁k-1项集
        for j in range(i + 1, lenLk):  # 从i+1开始遍历,确保不会重复组合
            L1 = list(Lk[i])[:k-2]  # 获取第i个频繁k-1项集的前k-2个元素
            L2 = list(Lk[j])[:k-2]  # 获取第j个频繁k-1项集的前k-2个元素
            
            # 当k=2时,L1和L2都是空集,因此这个检查可以跳过
            L1.sort()  # 排序L1
            L2.sort()  # 排序L2
            
            if L1 == L2:  # 如果这两个集合的前k-2个元素相同
                retList.append(Lk[i] | Lk[j])  # 将这两个集合合并生成候选k项集,并添加到返回列表中
    
    return retList  # 返回生成的候选k项集列表
D2=aprioriGen(D1, 2)
D2








def scanD(D, Ck, minsupport):  # 扫描整个事务数据集,并统计每个候选集的支持度
    ssCnt = {}  # 初始化一个字典来存储候选项集的支持度计数
    for tid in D:  # 遍历数据集中的每一个事务
        for can in Ck:  # 遍历候选项集中的每一个元素
            if can.issubset(tid):  # 如果事务包含候选项(即候选项是事务的子集)
                if can not in ssCnt:  # 如果这个候选项还没有出现在字典中
                    ssCnt[can] = 1  # 将其加入并设置计数值为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  # 返回满足条件的频繁项集列表和支持度信息字典

scanD(D,D2,0.4)
D3=aprioriGen(D2, 3)
D3
scanD(D,D3,0.4)

实例调包

import pandas as pd
item_list = [['牛奶','面包'], 
             ['面包','尿布','啤酒','土豆'], 
             ['牛奶','尿布','啤酒','可乐'], 
             ['面包','牛奶','尿布','啤酒'], 
             ['面包','牛奶','尿布','可乐']]
item_df = pd.DataFrame(item_list)

from mlxtend.preprocessing import transactionencoder
import mlxtend

# 导入TransactionEncoder类
from mlxtend.preprocessing import TransactionEncoder

# 创建TransactionEncoder的实例
te = transactionencoder.TransactionEncoder()

# 使用TransactionEncoder的fit_transform方法将item_list转换为布尔矩阵
df_tf = te.fit_transform(item_list)

# 将布尔矩阵转换为DataFrame,并指定列名为事务中的项目名称
df = pd.DataFrame(df_tf, columns=te.columns_)

# 显示DataFrame的内容
display(df)


# 计算频繁项集
from mlxtend.frequent_patterns import apriori
frequent_itemsets = apriori(df, min_support=0.05,use_colnames=te.columns_)
frequent_itemsets

frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)
frequent_itemsets

#选择2频繁项集
print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)==2)])

# 计算关联规则
from mlxtend.frequent_patterns import association_rules# metric可以有很多的度量选项,返回的表列名都可以作为参数
association_rule =association_rules(frequent_itemsets,metric='confidence',min_threshold=0.9)
association_rule

#关联规则可以提升度排序
association_rule.sort_values(by='lift',ascending=False,inplace=True)
association_rule
# 规则是:antecedents->consequents

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务