毕业设计:基于python商品推荐系统+协同过滤推荐算法+网络爬虫 2种推荐算法(源码+论文)✅

184 篇文章 44 订阅
178 篇文章 6 订阅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、项目介绍

技术栈:
Django框架、双协同过滤推荐算法(基于物品+基于用户)、requests爬虫、HTML

项目功能:

  1. 登录、注册、退出
  2. 首页(包含2种协同过滤推荐算法)
  3. 商品详情页
  4. 搜索页面
  5. 类别页面
  6. 收藏商品功能
  7. 给商品打分功能
  8. 购买商品功能

2、项目界面

(1)协同过滤推荐算法推荐商品–2种推荐算法

在这里插入图片描述

(2)系统首页----商品分类

在这里插入图片描述

(3)商品搜索

在这里插入图片描述

(4)商品详情页

在这里插入图片描述

(5)后台数据管理

在这里插入图片描述

(6)数据网络爬虫

在这里插入图片描述

3、项目说明

首页是有推荐商品的,根据协同过滤算法进行推荐,有两种方式
一种是基于用户的推荐算法(权重来自用户给商品的打分)
另一种是基于商品的推荐算法(权重来自用户浏览了哪些商品)
主要代码位置: product/views.py 中的 index 方法(代码中的16行开始)
这个方法主要是实现了:

  1. 获取秒杀商品,这里是从数据库中随机获取5个商品,每次都不一样
  2. 获取所有商品的分类,也就是代码中的 categories
  3. 如果用户登录了,那推荐商品就用 recommend_by_item 和 recommend_by_user_id 这俩个方法进
    行获取,详细的推荐算法请看源代码
  4. 如果用户没登陆,那推荐商品就是随机从数据库中获取

Python协同过滤算法商品推荐系统是一个基于Python的机器学习应用程序,可以根据已有用户的偏好数据,分析出不同用户的兴趣相似度,并根据计算出来的相似度值向用户推荐最适合的商品。
具体来说,该系统可以通过使用Python的机器学习库如scikit-learn、pandas等来实现协同过滤算法。该算法主要分为两种:基于用户的协同过滤和基于物品的协同过滤。基于用户的协同过滤是指根据用户对一系列物品的评价历史,计算不同用户之间的相似度,进而推荐相似度高的用户之间喜欢的物品。而基于物品的协同过滤则是根据物品之间的相似性进行推荐,即寻找与用户已评价过的物品最相似的物品进行推荐。
在系统实现方面,需要从数据库中获取历史的用户评价数据,通过数据清洗和处理,生成用户评价矩阵和物品评价矩阵。然后将这些数据传入机器学习模型中进行训练,并根据用户已评价过的商品和相似度计算方法来预测用户未评价过的物品的评分。在推荐时,系统可以根据预测出的评分值,向用户推荐得分最高的物品。
此外,为了提高推荐准确性,系统还可以将其他因素如价格、销量等纳入考虑范围,并按照一定的规则进行加权处理。同时,为了增强用户体验,系统还可以开发用户界面,提供商品搜索、推荐列表等功能,使得用户可以更加便捷地找到自己需要的商品。
总之,Python协同过滤算法商品推荐系统是一种高效、准确、个性化的推荐系统,不仅可以提高用户购物体验,还可以帮助商家更好地了解市场需求,实现营销增长。

4、核心代码


"""
协同过滤-基于商品
"""

import math

from account.models import Account
from product.models import Product


class ItemCF:

    # 获得初始化数据
    def __init__(self, data):
        self.similar = dict()
        self.data = data

    def item_similarity(self):
        # 建立物品-物品的共现矩阵
        cooccur = dict()  # 物品-物品的共现矩阵
        buy = dict()  # 物品被多少个不同用户购买N
        for user, items in self.data.items():
            for i in items.keys():
                buy.setdefault(i, 0)
                buy[i] += 1
                cooccur.setdefault(i, {})
                for j in items.keys():
                    if i == j:
                        continue
                    cooccur[i].setdefault(j, 0)
                    cooccur[i][j] += 1
        # 计算相似度矩阵
        for i, related_items in cooccur.items():
            self.similar.setdefault(i, {})
            for j, cij in related_items.items():
                self.similar[i][j] = cij / (math.sqrt(buy[i] * buy[j]))
        print('similar items: ', self.similar.items())
        return self.similar

    # 给用户user推荐,前K个相关用户,前N个物品
    def recommend(self, user, K=6, N=15):
        rank = dict()
        action_item = self.data[user]
        # 用户user产生过行为的item和评分
        for item, score in action_item.items():
            sorted_items = sorted(self.similar[item].items(), key=lambda x: x[1], reverse=True)[0:K]
            for j, wj in sorted_items:
                if j in action_item.keys():
                    continue
                rank.setdefault(j, 0)
                rank[j] += score * wj
        return sorted(rank.items(), key=lambda x: x[1], reverse=True)[0:N]


def recommend_by_item(user_id, u_num=5, p_num=15):
    """
    这是根据用户的浏览数据,进行推荐的
    """
    current_user = Account.objects.get(id=user_id)
    # print("我是当前用户")
    print(current_user.footmark_set.count())
    # 如果当前用户没有浏览任何商品 则按照热度顺序返回
    if current_user.footmark_set.count() == 0:
        book_list = Product.objects.all().order_by("-views_count")[:p_num]
        return book_list
    users = Account.objects.all()
    # 构建评分矩阵
    all_user = {}
    for user in users:
        rates = user.footmark_set.all()
        rate = {}
        # 用户有浏览商品,包装成字典的形式
        if rates:
            for i in rates:
                if i.product.id in rate:
                    rate[i.product.id] += 1
                else:
                    rate.setdefault(str(i.product.id), 1)  # 浏览一次设置为1分
            all_user.setdefault(user.username, rate)
        else:
            # 用户没有浏览过商品,设为0
            all_user.setdefault(user.username, {})
    print("this is all user:", all_user)
    item = ItemCF(data=all_user)
    item.item_similarity()
    recommend_dict = item.recommend(current_user.username, u_num, p_num)
    print('recommend_dict: ', recommend_dict)

    if not recommend_dict:
        # 如果=没有推荐任何商品 则按照热度顺序返回
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list

    good_list = [each[0] for each in recommend_dict]
    print('good_list: ', good_list)
    product_qu = Product.objects.filter(id=good_list[0])
    for i in range(1, len(good_list)):
        product_qu = product_qu | Product.objects.all().filter(id=good_list[i])
    return product_qu


def recommend_by_item_collect(user_id, u_num=5, p_num=15):
    """
    这是根据用户收藏的数据进行推荐的
    """
    current_user = Account.objects.get(id=user_id)
    # print("我是当前用户")
    print(current_user.collect_set.count())
    # 如果当前用户没有浏览任何商品 则按照热度顺序返回
    if current_user.collect_set.count() == 0:
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list
    users = Account.objects.all()
    # 构建评分矩阵
    all_user = {}
    for user in users:
        rates = user.collect_set.all()
        rate = {}
        # 用户有浏览商品,包装成字典的形式
        if rates:
            for i in rates:
                if i.product.id in rate:
                    rate[i.product.id] += 1
                else:
                    rate.setdefault(str(i.product.id), 1)  # 收藏一次设置为1分
            all_user.setdefault(user.username, rate)
        else:
            # 用户没有浏览过商品,设为0
            all_user.setdefault(user.username, {})
    print("this is all user:", all_user)
    item = ItemCF(data=all_user)
    item.item_similarity()
    recommend_dict = item.recommend(current_user.username, u_num, p_num)
    print('recommend_dict: ', recommend_dict)

    if not recommend_dict:
        # 如果=没有推荐任何商品 则按照热度顺序返回
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list

    good_list = [each[0] for each in recommend_dict]
    print('good_list: ', good_list)
    product_qu = Product.objects.filter(id=good_list[0])
    for i in range(1, len(good_list)):
        product_qu = product_qu | Product.objects.all().filter(id=good_list[i])
    return product_qu



5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

  • 37
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值