首页 > 其他分享 >【机器学习】Django,余弦距离之基于用户,评分物品的推荐

【机器学习】Django,余弦距离之基于用户,评分物品的推荐

时间:2023-12-08 11:00:28浏览次数:31  
标签:评分 array 余弦 物品 user id 主键 Django ID

表设计

# 用户表 
class UserInfo(models.Model):
    username = models.CharField(max_length=32,unique=True,verbose_name="用户名")
    password = models.CharField(max_length=64)

# 物品表
class Movies(models.Model):
    name = models.CharField(max_length=255,verbose_name="电影名称")
    movie_score =  models.FloatField(verbose_name="评分(未评分的为0)")
    
# 评分表
class UserScore(models.Model):
    movie = models.ForeignKey(to="Movies",verbose_name="电影",on_delete=models.CASCADE)
    user = models.ForeignKey(to="UserInfo",verbose_name="用户",on_delete=models.CASCADE)
    movie_score = models.FloatField(verbose_name="评分")
 

整理数据集

user_id = request.GET.get("user_id")

outList = []  # 二维数组
userIds = []  # 用户主键数组
goodsIds = []  # GOODS主键数组

# 遍历用户 - 整理数据结构成二维数组
for user_obj in models.UserInfo.objects.order_by("id"):
    userIds.append(user_obj.id)   # 储存用户ID     (找到用户主键)
    goodsIds = []  				 # 储存GOODS ID  (找到物品主键)
    innerList = []  			 # 储存特征数值   (array二维对象)
    
    # 遍历数据
    for movie_obj in models.Movies.objects.order_by("id"):
        # 储存GOODS ID
        goodsIds.append(movie_obj.id)
        try:
            # 获取用户评分
            movie_score = models.UserScore.objects.get(user_id=user_obj.id, movie_id=movie_obj).movie_score
         except:
            # 如果没有评分的物品为0
            movie_score = 0
            
            # 储存特征数值
            innerList.append(movie_score)
            outList.append(innerList)
            
                # 转换array对象
                user_ratings = np.array(outList)
                # 计算推荐ID 5个
                tj_goods_list = user_similarity_check(user_id,user_ratings, userIds, goodsIds, 5)
                # 数据库中查找
                QuerySetData = models.Movies.objects.filter(pk__in=tj_goods_list)
                # 未评分的为0
                for J in QuerySetData:
                    try:
                        J.movie_score = models.UserScore.objects.get(user_id=user_id, movie_id=J.id).movie_score
                     except:
                        J.movie_score = 0

计算相似度,推荐商品ID

# 计算用户相似度进行推荐物品ID
def user_similarity_check(user_id,user_ratings_array,userIds,goodsIds,count):
    import random
    """
        :param user_id:      当前用户ID
        :param user_ratings_array: np.array 二维数组 对象
                             user_ratings = np.array([
                                     [5, 3, 0, 0, 2],   # 用户主键ID 1 的评分
                                     [4, 0, 0, 0, 1],   # 用户主键ID 2 的评分
                                     [物品主键1, 物品主键2, 物品主键3, 物品主键4, 物品主键5],
                             ])
        :param userIds:    用户主键ID 对应每行的ID
        :param goodsIds:   物品主键ID 对应每列的ID
        :param count :     返回多少个推荐商品
        :return:        返回数组 ,包含推荐商品ID
    """
    # 计算特征相似度
    user_similarity = cosine_similarity(user_ratings_array)
    # 匹配当前用户ID 在索引里面的位置 在下面查询后直接使用
    user_index = np.where(np.array(userIds) == int(user_id))[0][0]
    # 查询出最相似的索引用户排序情况
    user_tj_list = np.argsort(-user_similarity[user_index])
    # 获取除了自身的最近的ID
    tj_user_id = user_tj_list[1]
    # 推荐GOODS
    recommended_items = user_ratings_array[tj_user_id]
    # 取出大于0的GOODS 的ID 进行推荐
    matching_indexes = np.where(recommended_items > 0)[0]
    matching_goodsIds = [goodsIds[index] for index in matching_indexes]
    return random.sample(matching_goodsIds,count)




# 计算评分相似度进行推荐物品ID
def item_similarity_check(user_id,goods_ratings_array,userIds,goodsIds,count):
    """
           :param goods_ratings_array: np.array 二维数组 对象
                                user_ratings = np.array([
                                        [5, 3, 0, 0, 2],   # 用户主键ID 1 的评分
                                        [4, 0, 0, 0, 1],   # 用户主键ID 2 的评分
                                        [物品主键1, 物品主键2, 物品主键3, 物品主键4, 物品主键5],
                                ])
           :param userIds:    用户主键ID 对应每行的ID
           :param goodsIds:   物品主键ID 对应每列的ID
           :param count :     返回多少个推荐商品
           :return:           返回数组 ,包含推荐商品ID
       """
    # 计算物品相似度
    item_similarity = cosine_similarity(goods_ratings_array.T)
    # 取出该用户对所有评分的物品 List
    user_index = np.where(np.array(userIds) == int(user_id))[0][0]
    this_user_list = goods_ratings_array[user_index]
    # 取出该用户评分为0的物品 索引列表    [5, 4, 0, 0, 2] => [2, 3]
    unrated_items = np.where(this_user_list == 0)[0]
    #             物品之间的相似度   该用户对物品的评分   ====>    计算两个数组的点积(即矩阵乘法)
    top = np.dot(item_similarity, goods_ratings_array[user_index]) 
    # 包含所有物品的预测评分的数组(或向量),其中每个元素表示该物品的预测评分。
    
    
    # 包含每个物品的相似度之和的数组(或向量),其中每个元素表示每个物品与其他所有物品的相似度之和
    down = np.sum(item_similarity, axis=1)  
    # 计算用户对未评分物品的兴趣度
    scores = top / down  
    # 计算用户对未评分物品的兴趣度
    top_items = [x for x in sorted(zip(unrated_items, scores[unrated_items]), key=lambda x: x[1], reverse=True)]
    # 获取索引
    tj_goods_id_list = [x[0] for x in top_items[0:count]]
    matching_elements = [goodsIds[index] for index in tj_goods_id_list]
    return matching_elements

标签:评分,array,余弦,物品,user,id,主键,Django,ID
From: https://www.cnblogs.com/wanghong1994/p/17884699.html

相关文章

  • vue-django 前端bootstrap配置
    2、前端引入bootstrap下载bootstrap源码,放在vue中的src目录中https://v5.bootcss.com/docs/getting-started/download/https://getbootstrap.net/docs/getting-started/introduction/在vue根目录修改main.jsimport{createApp}from'vue'importAppfrom'./App.vue'im......
  • Django高级特性:django-apscheduler定时任务
     前言:在使用Django框架开发web项目时,很多时候需要设置定时任务或让用户手动在页面上设置定时任务在Django中实现定时任务功能大概有以下三种方法:Celery分布式任务队列。侧重实时操作,可用于生产系统处理数以百万计的任务,都用于大型项目,配置和使用较为复杂。由于它本身......
  • Django ORM 多表操作:一对一、一对多、多对多的增删改查 (二)
    DjangomodelORM数据表相关操作分析思路,创建数据表对于表操作,表之间的关联关系,必须理解他们之间的关系,对于编程很重要。可以看看映射关系、外键和relationship查询,至少明白外键相关基本知识。下面是简单的demo1.创建数据模型models.py文件,fromdjango.dbimportmodels#Cre......
  • Django开发中csrf 的作用和含义以及用法
    在Django中,CSRF指的是跨站请求伪造(Cross-SiteRequestForgery)。这是一种网络入侵方法,入侵者诱使已认证的用户在他们不知情的情况下发送伪造的请求,比如在用户登录某个受信任网站后,在另一个标签页中访问恶意网站,恶意网站上的脚本可以发送请求到受信任网站,而这个请求会携带用户的......
  • DjangoORM语法
    ORM语法-配置django中与数据库映射的关系,不需要写原始sql语句,而是定义模型类,操作模型完成对数据库进行增删改查等操作。o指类对象的意思r指数据库表的意思m指映射的意思orm的优点数据库模型定义在一个地方,方便维护orm有现成的工具,很多功能自动完成,比如数据库消除,预处......
  • django02
    django小白必会三板斧#启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py#django自带重启功能当识别到项目中代码有变化之后隔段时间会自动重启但是有时候较慢#与浏览器打交道的视图函数都应该有返回值常见......
  • Django中ForeignKey函数详解
    在Django中,ForeignKey是一个数据库模型字段,用于创建多对一(many-to-one)的关系。它实质上是数据库表之间的一个链接,指向另一个模型的实例。在Django的ORM(对象关系映射)系统中,ForeignKey字段非常重要,因为它允许模型间的数据关联和交互。基本用法在Django模型中定义ForeignKey......
  • 解决vue-django配置问题
    后端跨域问题django安装pipinstalldjango-cors-headers添加应用,主应用下的settingINSTALLED_APPS=[...#跨域'corsheaders',...]中间件设置MIDDLEWARE=[...#跨域中间键设置'corsheaders.middleware.CorsMiddleware', ...]添加黑白名单(se......
  • django BaseCommand
    使用命令行执行脚本fromdjango.core.management.baseimportBaseCommandfromdjango.dbimporttransactionfromapps.db.modelsimportAdminMenuclassCommand(BaseCommand):help='管理端、PC端、H5端菜单'defadd_arguments(self,parser):pars......
  • Django学习(二) 之 模板的使用
    写在前面昨晚应该是睡的最好一天吧,最近一个月睡眠好差,睡不着不说,而且半夜总醒,搞的我第二天就会超没精神。昨天下午去姐姐家,我刚进屋,小外甥直接就问我说:老舅,你都很长时间没来啦,**(前女友)哪去了,我们都好久没出溜溜了!我顿了下说,她不喜欢我们了,等以后天暖和,我们再去溜溜。......