请问这段代码是如何实现相似度和相似性的计算的呢?

img


题主想运用协同过滤算法实现一个电影推荐系统,大体知道求相似度的几种方法,看到网络上别人写的代码有点看不懂,求解惑

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7594907
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:基于矩阵分解的协同过滤推荐算法原理及代码
  • 除此之外, 这篇博客: 判断用户名是否已被注册的三种方法中的 在验证注册的视图函数里,在通过验证之后加上判断用户名是否存在的判断 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    # 注册的视图函数
    def register(request):
        if request.method == "POST":
            ret = {"status": 0, "msg": ""}
            form_obj = forms.RegForm(request.POST)
            print(request.POST)
            # 帮我做校验
            if form_obj.is_valid():
                # 校验通过,去数据库创建一个新的用户
                username = form_obj.cleaned_data.get("username")
                is_exist = models.UserInfo.objects.filter(username=username)
                # 判断用户名是否已存在,可以放到钩子函数里
                if is_exist:
                    ret['status'] = 1
                    ret['msg'] = '用户名已存在'
                    return JsonResponse(ret)
                form_obj.cleaned_data.pop("re_password")
                avatar_img = request.FILES.get("avatar")
                models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img,phone="123123")
                ret["msg"] = "/index/"
                return JsonResponse(ret)
            else:
                print(form_obj.errors)
                ret["status"] = 1
                ret["msg"] = form_obj.errors
                print(ret)
                print("=" * 120)
                return JsonResponse(ret)
        # 生成一个form对象
        form_obj = forms.RegForm()
        print(form_obj.fields)
        return render(request, "register.html", {"form_obj": form_obj})
    
  • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商品牌文案设计方法课程中的 文字的视觉化方法小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    回答:

    在协同过滤算法中,计算相似度和相似性是非常重要的一步。下面是具体的代码实现方法:

    1. 计算相似度

    相似度可以使用余弦相似度公式进行计算。假设我们要计算用户A和用户B之间的相似度,那么可以使用以下代码:

    import numpy as np
    
    def cosine_similarity(ratings, user1, user2):
        # 获取用户A和用户B共同评价过的电影列表
        common_movies = list(set(ratings[user1].keys()) & set(ratings[user2].keys()))
    
        # 如果没有共同评价过的电影,说明相似度为0
        if len(common_movies) == 0:
            return 0
    
        # 计算用户A和用户B的评分向量
        user1_ratings = np.array([ratings[user1][movie] for movie in common_movies])
        user2_ratings = np.array([ratings[user2][movie] for movie in common_movies])
    
        # 计算余弦相似度
        similarity = np.dot(user1_ratings, user2_ratings) / (np.linalg.norm(user1_ratings) * np.linalg.norm(user2_ratings))
    
        return similarity
    
    1. 计算相似性

    在协同过滤算法中,通常会使用相似性来度量用户之间的关系,可以使用Pearson相关系数来计算相似性。假设我们要计算用户A和用户B之间的相似性,那么可以使用以下代码:

    def pearson_similarity(ratings, user1, user2):
        # 获取用户A和用户B共同评价过的电影列表
        common_movies = list(set(ratings[user1].keys()) & set(ratings[user2].keys()))
    
        # 如果没有共同评价过的电影,说明相似度为0
        if len(common_movies) == 0:
            return 0
    
        # 计算用户A和用户B的评分平均值
        user1_mean = np.mean([ratings[user1][movie] for movie in common_movies])
        user2_mean = np.mean([ratings[user2][movie] for movie in common_movies])
    
        # 计算用户A和用户B的评分向量
        user1_ratings = np.array([ratings[user1][movie] for movie in common_movies])
        user2_ratings = np.array([ratings[user2][movie] for movie in common_movies])
    
        # 计算Pearson相关系数
        numerator = np.sum((user1_ratings - user1_mean) * (user2_ratings - user2_mean))
        denominator = np.sqrt(np.sum((user1_ratings - user1_mean) ** 2) * np.sum((user2_ratings - user2_mean) ** 2))
    
        # 避免分母为0的情况
        if denominator == 0:
            return 0
    
        similarity = numerator / denominator
        return similarity
    

    以上是协同过滤算法中计算相似度和相似性的代码实现方法。希望能够帮助你实现电影推荐系统。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^