协同过滤毕业设计 商品推荐系统

news2024/11/27 8:40:10

文章目录

  • 1 简介
  • 2 常见推荐算法
    • 2.1 协同过滤
    • 2.2 分解矩阵
    • 2.3 聚类
    • 2.4 深度学习
  • 3 协同过滤原理
  • 4 系统设计
    • 4.1 示例代码(py)
  • 5 系统展示
    • 5.1 系统界面
    • 5.2 推荐效果
  • 6 最后

1 简介

🔥 Hi,大家好,这里是学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩 协同过滤商品推荐系统设计与实现

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

2 常见推荐算法

2.1 协同过滤

协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分。所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过滤,则是过滤掉一些不值得推荐的数据,比比如推荐值评分低的数据,或者虽然推荐值高但是用户已经购买的数据。

协同过滤的模型一般为m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。

一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤。

基于用户的协同过滤的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的用户群,然后基于这些用户的历史偏好,为当前用户进行推荐。

在这里插入图片描述
假设用户A喜欢物品A、物品C,用户B喜欢物品B,用户C喜欢物品A、物品C和物品D。从这些用户的历史偏好中,我们可以看出用户A和用户C的偏好是类似的。同时我们可以看到用户C喜欢物品D,所以我们可以猜想用户A可能也喜欢物品D,因此可以把物品D推荐给用户A。

2.2 分解矩阵

这是一个非常优雅的推荐算法,因为当涉及到矩阵分解时,我们通常不会太多地去思考哪些项目将停留在所得到矩阵的列和行中。但是使用这个推荐引擎,我们清楚地看到,u是第i个用户的兴趣向量,v是第j个电影的参数向量。

在这里插入图片描述
所以我们可以用u和v的点积来估算x(第i个用户对第j个电影的评分)。我们用已知的分数构建这些向量,并使用它们来预测未知的得分。

例如,在矩阵分解之后,Ted的向量是(1.4; .8),商品A的向量是(1.4; .9),现在,我们可以通过计算(1.4; .8)和(1.4; .9)的点积,来还原商品A-Ted的得分。结果,我们得到2.68分。
    
在这里插入图片描述

2.3 聚类

上面两种算法都极其简单,适用于小型系统。在这两种方法中,我们把推荐问题当做一个有监督机器学习任务来解决。

现在,该开始用无监督学习来解决问题了。

假设我们正在建立一个大型推荐系统,这时协同过滤和矩阵分解花费的时间更长了。第一个浮现在脑海里的解决之道,就是聚类。

业务开展之初,缺乏之前的用户数据,聚类将是最好的方法。

不过,聚类是一种比较弱的个性化推荐,因为这种方法的本质是识别用户组,并对这个组内的用户推荐相同的内容。

当我们有足够数据时,最好使用聚类作为第一步,来缩减协同过滤算法中相关邻居的选择范围。这个方法还能挺高复杂推荐系统的性能。

每个聚类都会根据其中用户的偏好,来分配一组典型的偏好。每个聚类中的用户,都会收到为这个聚类计算出的推荐内容。

2.4 深度学习

在过去的十年中,神经网络已经取得了巨大的飞跃。如今,神经网络已经得以广泛应用,并逐渐取代传统的机器学习方法。

接下来,我要介绍一下YouTube如何使用深度学习方法来做个性化推荐。

毫无疑问,由于体量庞大、动态库和各种观察不到的外部因素,为YouTube用户提供推荐内容是一项非常具有挑战性的任务。

根据《Deep Neural Networks for YouTube Recommendations》( https://static.googleusercontent.com/media/research.google.com/ru//pubs/archive/45530.pdf ),YouTube的推荐系统算法由两个神经网络组成:一个用于候选生成,一个用于排序。如果你没时间仔细研究论文,可以看看我们下面给出的简短总结。

在这里插入图片描述
以用户的浏览历史为输入,候选生成网络可以显著减小可推荐的视频数量,从庞大的库中选出一组最相关的视频。这样生成的候选视频与用户的相关性最高,然后我们会对用户评分进行预测。

这个网络的目标,只是通过协同过滤提供更广泛的个性化。

在这里插入图片描述
进行到这一步,我们得到一组规模更小但相关性更高的内容。我们的目标是仔细分析这些候选内容,以便做出最佳的选择。

这个任务由排序网络完成。

所谓排序就是根据视频描述数据和用户行为信息,使用设计好的目标函数为每个视频打分,得分最高的视频会呈献给用户。
在这里插入图片描述
通过这两步,我们可以从非常庞大的视频库中选择视频,并面向用户进行有针对性的推荐。这个方法还能让我们把其他来源的内容也容纳进来。
在这里插入图片描述
推荐任务是一个极端的多类分类问题。这个预测问题的实质,是基于用户(U)和语境©,在给定的时间t精确地从库(V)中上百万的视频类(i)中,对特定的视频观看(Wt)情况进行分类。

3 协同过滤原理

使用基于物品的协同过滤,需要维护一个物品相似度矩阵;使用基于用户的协同过滤,需要维护一个用户相似度矩阵。
在这里插入图片描述
两用户之间的相似度的计算其实很简单,用户i与用户j的相似度 = (i、j都打开过的网页数)/根号(i打开过的网页数 * j打开过的网页数)。这个计算与“基于物品的协同过滤”中的物品之间相似度的计算是类似的。

在这里插入图片描述

上面是一个用户相似度计算的案例。我们试着计算A和D之间的相似度。从“用户打开过的网页”可以看出,A和D都打开过的网页只有d,也就是1个。用户A打开过的网页数=3,用户D打开过的网页数=3。所以A和D的相似度=1/根号(3*3)。其他的计算也是类似的。

有了用户之间的相似度之后,就可以计算推荐度了。假设e是刚刚发布的文章,这时候用户B、C、D都浏览到e新闻的标题,其中C、D点击了,我们就可以计算A对e的兴趣度。

A对e的兴趣度=A与B的相似度B对e的兴趣度 + A与C的相似度C对e的兴趣度 + A与D的相似度*D对e的兴趣度。 因为我们这里用的不是评分制,而是考虑是否点击,那么D点击了e,D对e的兴趣度=1。

A对e的兴趣度 = 1/根号(6)*1 + 1/根号(6)*1 + 1/根号(9)*1

所以,比如100篇新的文章出来之后,对部分用户进行了曝光,然后就可以根据用户相似度,来预计其他用户对这篇文章的兴趣度,进而挑选这100篇中预计兴趣度最高的30篇曝光给这群用户。

4 系统设计

4.1 示例代码(py)

from abc import ABCMeta, abstractmethod
import numpy as np
from collections import defaultdict


class CF_base(metaclass=ABCMeta):
    def __init__(self, k=3):
        self.k = k
        self.n_user = None
        self.n_item = None

    @abstractmethod
    def init_param(self, data):
        pass

    @abstractmethod
    def cal_prediction(self, *args):
        pass

    @abstractmethod
    def cal_recommendation(self, user_id, data):
        pass

    def fit(self, data):
        # 计算所有用户的推荐物品
        self.init_param(data)
        all_users = []
        for i in range(self.n_user):
            all_users.append(self.cal_recommendation(i, data))
        return all_users


class CF_knearest(CF_base):
    """
    基于物品的K近邻协同过滤推荐算法
    """

    def __init__(self, k, criterion='cosine'):
        super(CF_knearest, self).__init__(k)
        self.criterion = criterion
        self.simi_mat = None
        return

    def init_param(self, data):
        # 初始化参数
        self.n_user = data.shape[0]
        self.n_item = data.shape[1]
        self.simi_mat = self.cal_simi_mat(data)
        return

    def cal_similarity(self, i, j, data):
        # 计算物品i和物品j的相似度
        items = data[:, [i, j]]
        del_inds = np.where(items == 0)[0]
        items = np.delete(items, del_inds, axis=0)
        if items.size == 0:
            similarity = 0
        else:
            v1 = items[:, 0]
            v2 = items[:, 1]
            if self.criterion == 'cosine':
                if np.std(v1) > 1e-3:  # 方差过大,表明用户间评价尺度差别大需要进行调整
                    v1 = v1 - v1.mean()
                if np.std(v2) > 1e-3:
                    v2 = v2 - v2.mean()
                similarity = (v1 @ v2) / np.linalg.norm(v1, 2) / np.linalg.norm(v2, 2)
            elif self.criterion == 'pearson':
                similarity = np.corrcoef(v1, v2)[0, 1]
            else:
                raise ValueError('the method is not supported now')
        return similarity

    def cal_simi_mat(self, data):
        # 计算物品间的相似度矩阵
        simi_mat = np.ones((self.n_item, self.n_item))
        for i in range(self.n_item):
            for j in range(i + 1, self.n_item):
                simi_mat[i, j] = self.cal_similarity(i, j, data)
                simi_mat[j, i] = simi_mat[i, j]
        return simi_mat

    def cal_prediction(self, user_row, item_ind):
        # 计算预推荐物品i对目标活跃用户u的吸引力
        purchase_item_inds = np.where(user_row > 0)[0]
        rates = user_row[purchase_item_inds]
        simi = self.simi_mat[item_ind][purchase_item_inds]
        return np.sum(rates * simi) / np.linalg.norm(simi, 1)

    def cal_recommendation(self, user_ind, data):
        # 计算目标用户的最具吸引力的k个物品list
        item_prediction = defaultdict(float)
        user_row = data[user_ind]
        un_purchase_item_inds = np.where(user_row == 0)[0]
        for item_ind in un_purchase_item_inds:
            item_prediction[item_ind] = self.cal_prediction(user_row, item_ind)
        res = sorted(item_prediction, key=item_prediction.get, reverse=True)
        return res[:self.k]


class CF_svd(CF_base):
    """
    基于矩阵分解的协同过滤算法
    """

    def __init__(self, k=3, r=3):
        super(CF_svd, self).__init__(k)
        self.r = r  # 选取前k个奇异值
        self.uk = None  # 用户的隐因子向量
        self.vk = None  # 物品的隐因子向量
        return

    def init_param(self, data):
        # 初始化,预处理
        self.n_user = data.shape[0]
        self.n_item = data.shape[1]
        self.svd_simplify(data)
        return data

    def svd_simplify(self, data):
        # 奇异值分解以及简化
        u, s, v = np.linalg.svd(data)
        u, s, v = u[:, :self.r], s[:self.r], v[:self.r, :]  # 简化
        sk = np.diag(np.sqrt(s))  # r*r
        self.uk = u @ sk  # m*r
        self.vk = sk @ v  # r*n
        return

    def cal_prediction(self, user_ind, item_ind, user_row):
        rate_ave = np.mean(user_row)  # 用户已购物品的评价的平均值(未评价的评分为0)
        return rate_ave + self.uk[user_ind] @ self.vk[:, item_ind]  # 两个隐因子向量的内积加上平均值就是最终的预测分值

    def cal_recommendation(self, user_ind, data):
        # 计算目标用户的最具吸引力的k个物品list
        item_prediction = defaultdict(float)
        user_row = data[user_ind]
        un_purchase_item_inds = np.where(user_row == 0)[0]
        for item_ind in un_purchase_item_inds:
            item_prediction[item_ind] = self.cal_prediction(user_ind, item_ind, user_row)
        res = sorted(item_prediction, key=item_prediction.get, reverse=True)
        return res[:self.k]


if __name__ == '__main__':
    # data = np.array([[4, 3, 0, 5, 0],
    #                  [4, 0, 4, 4, 0],
    #                  [4, 0, 5, 0, 3],
    #                  [2, 3, 0, 1, 0],
    #                  [0, 4, 2, 0, 5]])
    data = np.array([[3.5, 1.0, 0.0, 0.0, 0.0, 0.0],
                     [2.5, 3.5, 3.0, 3.5, 2.5, 3.0],
                     [3.0, 3.5, 1.5, 5.0, 3.0, 3.5],
                     [2.5, 3.5, 0.0, 3.5, 4.0, 0.0],
                     [3.5, 2.0, 4.5, 0.0, 3.5, 2.0],
                     [3.0, 4.0, 2.0, 3.0, 3.0, 2.0],
                     [4.5, 1.5, 3.0, 5.0, 3.5, 0.0]])
    # cf = CF_svd(k=1, r=3)
    cf = CF_knearest(k=1)
    print(cf.fit(data))

5 系统展示

5.1 系统界面

在这里插入图片描述

5.2 推荐效果

在这里插入图片描述

6 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM面试题详解系列——垃圾回收详解

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap&am…

如何将 Credly 中的数字徽章转成二维码

如何将 Credly 中的数字徽章转成二维码 在 Credly 数字证书 这一篇文章中要说过当完成 AWS Academy Cloud Foundations 课程后,可以申请一个结业证书徽章,已下逐步说明,如何申请结业证书徽章,并转成二维码,可以放在个…

Guitar Pro8电脑版更新下载及主要功能介绍

想成为一名专业甚至著名的音乐人,用到的工具软件非常多,在众多款软件工具中,Guitar Pro 8能满足乐谱创作者、学习者的所有需要。 Guitar Pro 8多达30项功能优化新版本 边听边看,支持添加音频轨道让音乐富有灵魂,精准…

用友U8 cloud,以应用牵引与价值驱动推进信创2.0阶段

经过多年发展的中国信创产业正进入新阶段,无论资本市场还是企业市场,都迎来“大爆发”。 信创的市场空间正在被打开。在今年9月底国家下发的79号文中,全面给出了国资信创产业发展与进度的指导,要求到2027年央企国企100%完成信创替…

IB学校书单合集请收藏好

努力一寒假,开学变学霸!阅读是提升学生思维能力的最佳方法,也是提升学习成绩的最有效途径。假期是最棒的阅读机会,然而什么书孩子爱读、读后有效? 小编为大家整理了几所国际学校的推荐书单,快带着孩子一起阅…

Kong 介绍

1 官方:Installing Kong Gateway (Enterprise) on Kubernetes - v2.5.x | Kong Docs 2 github: GitHub - pantsel/konga: More than just another GUI to Kong Admin API 什么是kong API 网关和 API 服务管理层,它基于 Nginx 和 OpenResty 开发的一个具…

自动化运维,国产化信创替代方案

IT国产化体系庞杂,整个产业链涉及网络基础设施、服务器、存储、数据库、中间件、操作系统等众多环节,近年来IT行业各领域国产化技术日趋成熟,但各厂商技术耦合性不高,依然存在兼容适配问题。 北京智和信通技术有限公司作为国产化…

矩阵的等价、相似、合同

文章目录矩阵等价相似合同等价、相似、合同的关系矩阵等价 1.定义:A,B均为mn型矩阵,若r(A)r(B)r(A)r(B)r(A)r(B) ,则矩阵A、B等价 【型同,秩等】 相似 1.定义:n阶方阵A,B,若ョ可逆矩阵P,使得 …

如何设计一个安全的对外接口,老司机总结了这几点

博主之前做过恒丰银行代收付系统(相当于支付接口),包括现在的oltpapi交易接口和虚拟业务的对外提供数据接口。总之,当你做了很多项目写了很多代码的时候,就需要回过头来,多总结总结,这样你会看到…

企业选择适合的云存储的4个技巧

免费和廉价的个人和小型企业云存储无处不在,因此人们需要选择一种更适合自己的云存储。 而面对越来越多的选择,如何选择更适合自己的云存储产品呢?在以往,大多数人根据所获得的存储量多少而决定,这种方法虽然简单,但无…

C语言作用域与内存布局

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 C语言作用域与内存布局作用域1. 局部变量2. 静态局部变量3. 全局变量4. 静态全局变量5. extern声明全局…

[附源码]Python计算机毕业设计SSM基于RationalRose的教务管理系统开发(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

css flex布局 —— 项目属性 align-self

align-self属性定义 flex 子项单独在侧轴(纵轴)方向上的对齐方式,可覆盖 align-items 属性。 默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。 语法 .item {align-…

Web3中文|跑路的NFT项目Frosties,是如何被“绳之以法”?

本文,我们将深入探讨传说中的NFT项目Frosties跑路过程,以及该项目的创始人在私吞超100 万美元后是如何被抓获的。 Frosties NFT跑路过程 Frosties是一个由8888幅作品组成的NFT系列,具有Doodles的轻松、有趣的风格。该系列于2022年1月9日上线…

Talk预告 | 阿里巴巴达摩院算法工程师许贤哲:DAMO-YOLO:兼顾速度与精度的高效目标检测框架

本期为TechBeat人工智能社区第463期线上Talk! 北京时间12月15日(周四)20:00,阿里巴巴达摩院算法工程师——许贤哲的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “DAMO-YOLO:兼顾速度与精度的高效目标检测框架”…

mysql索引的使用详解

一、 普通索引 ALTER TABLE 表名 ADD INDEX index_store_id索引名 ( 字段名 ) 二、唯一索引 它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。 ALTER TABLE table_name ADD UNIQUE (column)三、 组合索引…

实用干货| 教你一键实现微信小程序转APP

自有APP不但有利于企业品牌推广,同时还更有利于收集用户相关数据,从而帮助企业及时调整发展方向和目标。而从0到1进行自有APP的开发其实是一项耗时耗力的工程,为了节约时间和成本,不少企业考虑直接将其现有微信小程序转换成商用AP…

21--Django-后端开发-Web开发模式、API接口以及Restful规范

一、Web开发模式 前后端混合开发模式 前后端分离 二、API接口 1.定义: 通过网络,规定了前后台信息交互规则的url链接,是前后台信息交互的媒介。 2.特点: 1)url:长得像返回数据的url链接 https://api.map.baidu.com/place/v2/search 2)请求方式:get、post、put、patc…

大一学生《Web前端网课作业》基于HTML+CSS自我介绍网页设计与制作

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

Usaco Trainning刷怪旅第一层第三题:Friday the Thirteenth

Usaco Training网站 关注我持续更新usaco training题目 Is Friday the 13th really an unusual event? That is, does the 13th of the month land on a Friday less often than on any other day of the week? To answer this question, write a program that will compute …