• 【Day 11 协同过滤算法与Apriori算法】



    协同过滤算法

    原理

    协同过滤算法的原理主要基于两个关键观点:

    1. 用户行为相似性:如果两个用户在过去的行为中对项目的偏好相似,那么它们在未来也很可能对相同的项目有相同的偏好。同样,如果两个项目在过去的行为中被相似的用户喜欢,那么它们在未来也很可能被相似的用户喜欢。
    2. 项目相似性:如果两个项目经常被相同的用户喜欢,那么它们很可能具有相似的特征和属性。因此,如果用户对一个项目有很高的评分,那么他们也很可能对与该项目相似的其他项目有较高的评分。

    步骤

    1. 基于用户的协同过滤算法(User-based Collaborative Filtering):该算法将用户与其他相似用户进行比较,并基于其他相似用户的行为来为用户生成推荐。具体步骤包括:
      (1)计算用户之间的相似性(如余弦相似度、欧氏距离等)
      (2)找到与目标用户最相似的K个用户
      (3)根据这K个用户的行为来为目标用户生成推荐
    2. 基于项目的协同过滤算法(Item-based Collaborative Filtering):该算法将项目与其他相似项目进行比较,并基于其他相似项目的评分来为用户生成推荐。具体步骤包括:
      (1)计算项目之间的相似性(如余弦相似度、皮尔逊相似度等)
      (2)找到与目标项目最相似的K个项目
      (3)根据这K个项目的评分来为用户生成推荐

    Apriori算法

    简介

    Apriori算法是种挖掘关联规则的频繁项集算法,一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。Apriori算法已经被广泛的应用到商业、网络安全等各个领域。Apriori算法采用了逐层搜索的迭代的方法,算法简单明了,没有复杂的理论推导,也易于实现。

    原理

    首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递归的方法。

    步骤

    1. 设定最小支持度和最小置信度
    2. 根据最小支持度找出所有的频繁项集
    3. 根据最小置信度发现强关联规则

    Apriori算法代码实现

    中医病症关联规则分析

    背景介绍

    中医病案的各种症状是一个错综复杂的整体,但其中也有着密不可分的联系。通过对中医病症之间关系的分析,从而认识疾病的发生发展规律,掌握疾病的诊疗特点,并且获得治疗疾病的最适宜药方。而关联规则分析在寻找中医病因病机、病症之间的关系上发挥了巨大的作用,在挖掘病症之间的关联关系方面应用广泛且实用。

    分析步骤

    1. 读取数据
    2. 将“病人症状”列数据转换为双重列表结构
    3. 通过apyori库来实现Apriori算法,得到疾病症状的强关联规则

    代码实现

    import pandas as pd
    df = pd.read_excel('中医病症.xlsx')
    
    # 转换为双重列表结构
    symptoms = []
    for i in df['病人症状'].tolist():
        symptoms.append(i.split(','))
        
    # 通过apyori库来实现Apriori算法
    from apyori import apriori
    rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)
    results = list(rules)
    
    for i in results:  # 遍历results中的每一个频繁项集
        for j in i.ordered_statistics:  # 获取频繁项集中的关联规则
            X = j.items_base  # 关联规则的前件
            Y = j.items_add  # 关联规则的后件
            x = ', '.join([item for item in X])  # 连接前件中的元素
            y = ', '.join([item for item in Y])  # 连接后件中的元素
            if x != '':  # 防止出现关联规则前件为空的情况
                print(x + ' → ' + y)  # 通过字符串拼接的方式更好呈现结果
    
  • 相关阅读:
    Bert不完全手册3. Bert训练策略优化!RoBERTa & SpanBERT
    计算机毕业设计Java进出货管理系统(源码+系统+mysql数据库+lw文档)
    内网渗透之内网信息收集(四)
    集线器-交换机-路由器
    用Excel制作甘特图跟踪项目进度(附绘制教程)
    yaml&easydict作为参数文件
    java 把a.txt文件中的内容复制到当前项目目录下的b.txt文件中,2种方式比较复制效率 毫秒比较
    手眼标定笔记
    飞桨(PaddlePaddle)数据加载教程
    实用笔记-java配置
  • 原文地址:https://blog.csdn.net/qq_62084769/article/details/139805760