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

        前面的读书笔记中,提及了基于近邻方法的图模型。巧合的是,在周末刷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、共同看过的好友数量等诸多因素可以共同组成一个数学模型,基于这一模型,可以得到近邻的图模型中,各个边的权值(用户-物品),此时,问题可以表示为带权图的最短路径问题

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

猜你喜欢

转载自blog.csdn.net/qq_23937195/article/details/103952034