推荐系统基于近邻方法的图模型的简单案例与问题延伸——【leetcode 1311. 获取你好友已观看的视频】题解

这篇博客通过LeetCode 1311题的解题过程,探讨了如何使用广度优先搜索(BFS)构建基于用户的近邻推荐系统。文章指出,该问题本质上是寻找最短路径,并强调在实际推荐系统中需要考虑好友距离(level)的阈值、共同观看视频的好友数量等因素。作者提出,可以通过构建带权图模型解决最短路径问题,以优化推荐的视频排序。
摘要由CSDN通过智能技术生成

        前面的读书笔记中,提及了基于近邻方法的图模型。巧合的是,在周末刷leetcode的时候遇到了这样的一道题,觉得很适合用来做为图模型作近邻推荐的启发。遂AC后发出来,供大家参考。

正文

题目描述请点击链接:leetcode 1311. 获取你好友已观看的视频

        这道题leetcode标的难度中等,本质是最短路径问题,主要考察广度优先搜索(BFS)、Hash和排序。注意以下几点即可:

  1. 记录访问过的节点,避免重复访问——如果A与B是好友,则A与B互相存在于对方的好友列表中
  2. BFS不需要到最深一层,入参level是几就遍历到几即可
  3. 结果排序先对value排序,再对key排序。粗糙的办法是先排序key,再排序value,但是这样相当于执行了两次排序。效率较低,比较好的办法是构建优先级队列。

运行结果与代码

先炫一下我的运行结果

在这里插入图片描述

python代码

最后的结果,我用了两次排序,来实现题目期望的排序效果,但其实是比较低效的。用优先级队列会更好。

class Solution(object):
     def watchedVideosByFriends(self, watched_videos, friends, id, level):
        """
        :type watched_videos: List[List[str]]
        :type friends: List[List[int]]
        :type id: int
        :type level: int
        :rtype: List[str]
        """
        user_depth = {id: 0}
        has_friends_count = len(friends)
        q = [id]

        level_watched_videos = {}

        while len(q) > 0:
            cur_user_id = q.pop(0)
            depth = user_depth[cur_user_id] + 1

            if user_depth[cur_user_id] == level:
                for video in watched_videos[cur_user_id]:
                    if level_watched_videos.__contains__(video):
                        level_watched_videos[video] += 1
                    else:
                        level_watched_videos[video] = 1

            if cur_user_id < has_friends_count and depth <= level:
                for friend_user_id in friends[cur_user_id]:
                    if not user_depth.__contains__(friend_user_id):
                        user_depth[friend_user_id] = depth
                        q.append(friend_user_id)

        res = sorted(level_watched_videos.items(), key=lambda obj: obj[0])
        res = sorted(res, key=lambda obj: obj[1])
        ret = []
        for video in res:
            ret.append(video[0])

        return ret

问题延生

        这道题最终找到了第level层的好友看过的所有作品。实际上,这也是推荐系统中,基于用户的近邻推荐模型——以好友列表定义近邻。好友的level越低,越近邻,则他们看过的视频,也越高概率是当前用户需要的。

        这道题展示的模型是粗糙的,在实践中,如果我们要做近邻推荐,至少要考虑到以下问题:

  1. 与好友的距离定义为level=1,好友的好友定义为level=2,以此类推,显然level是存在阈值的,当level超出一定阈值时,可以认为其与原点(当前用户)无关,其看过的作品可以不必考虑。这个阈值可以基于实际需求判断,也可以基于经验或机器学习求得。
  2. level越低的好友看过的视频,符合当前用户需求的可能性越高。同时,越多好友共同看过的视频,符合当前用户需求的可能性越高。关键要意识到,不同物品对同一用户重要程度是不同的
  3. 当视频很多时,用户不需要也难以浏览所有推荐视频,其实,推送最高概率的k个视频给用户即可,这也是推荐系统中top-K问题的一种表现。
  4. 基于用户level、共同看过的好友数量等诸多因素可以共同组成一个数学模型,基于这一模型,可以得到近邻的图模型中,各个边的权值(用户-物品),此时,问题可以表示为带权图的最短路径问题

每个点的具体解决,其实就是调整权值的计算模型。需要根据具体情况具体讨论,这里暂时且引出思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值