协同过滤推荐系统在线购物系统
python商品推荐系统 基于协同过滤的商品推荐系统 在线购物系统 使用基于协同过滤的方法为用户推荐多种商品同时实现登陆、搜索、浏览商品、评论评分、加入购物车等多种功能 后台管理员可以实现增删改查等多种功能 采用pythonDjango框架实现 数据库采用mysql 前端采用htmlcssjs最近在Django框架上折腾了一个带商品推荐功能的购物系统核心用了协同过滤算法。这个项目最有趣的地方在于用户行为数据会实时影响推荐结果——你点个赞加个购物车系统可能下一秒就给你换推荐列表了。咱们先来看看怎么用Python把这事儿给办了。先说用户数据这块咱们的模型设计得记录用户的各种动作from django.contrib.auth.models import User class Product(models.Model): name models.CharField(max_length200) category models.CharField(max_length100) tags models.CharField(max_length300) # 用逗号分隔的标签 class UserBehavior(models.Model): user models.ForeignKey(User, on_deletemodels.CASCADE) product models.ForeignKey(Product, on_deletemodels.CASCADE) rating models.FloatField(nullTrue) # 评分 timestamp models.DateTimeField(auto_now_addTrue) behavior_type models.CharField(max_length20) # 浏览/购买/收藏等重点来了协同过滤的核心算法咱们这么实现。先搞个用户相似度矩阵这里用了余弦相似度计算# recommender.py from sklearn.metrics.pairwise import cosine_similarity import pandas as pd def build_similarity_matrix(): # 从数据库获取用户-商品评分数据 ratings UserBehavior.objects.filter(behavior_typerate).values(user_id, product_id, rating) df pd.DataFrame(list(ratings)) rating_matrix df.pivot_table(indexuser_id, columnsproduct_id, valuesrating).fillna(0) # 计算用户相似度 user_similarity cosine_similarity(rating_matrix) return user_similarity, rating_matrix def recommend_items(user_id, top_n10): user_sim, ratings build_similarity_matrix() similar_users user_sim[user_id-1].argsort()[-5:-1] # 取前4个相似用户 # 合并相似用户喜欢的商品 seen_items set(ratings.loc[user_id].to_dict().keys()) recommendations {} for sim_user in similar_users: for item in ratings.iloc[sim_user].items(): if item[0] not in seen_items and item[1] 3: # 过滤低分和已购 recommendations.setdefault(item[0], 0) recommendations[item[0]] item[1] * user_sim[user_id-1][sim_user] return sorted(recommendations.items(), keylambda x: x[1], reverseTrue)[:top_n]这段代码有个小技巧相似用户的选择范围控制在4个既保证推荐多样性又避免计算量爆炸。实际跑起来发现当用户评分数据稀疏时适当放宽到6-8个效果更好。python商品推荐系统 基于协同过滤的商品推荐系统 在线购物系统 使用基于协同过滤的方法为用户推荐多种商品同时实现登陆、搜索、浏览商品、评论评分、加入购物车等多种功能 后台管理员可以实现增删改查等多种功能 采用pythonDjango框架实现 数据库采用mysql 前端采用htmlcssjs前端交互方面用jQuery搞了个实时推荐刷新。用户点击收藏或评分时悄悄触发推荐更新// product_detail.html $(.rate-btn).click(function() { const score $(this).data(score); $.post(/rate_product/, {product_id: {{ product.id }}, score: score}, function() { // 拿到新推荐后动态更新页面 refresh_recommendations(); }); }); function refresh_recommendations() { $.get(/get_recommendations/, function(data) { $(#recommend-box).html(data); // 这里有个视觉特效 $(.recommend-item).hide().fadeIn(800); }); }数据库优化有个小门道——给用户行为表加了复合索引CREATE INDEX user_product_idx ON UserBehavior(user_id, product_id); CREATE INDEX behavior_type_idx ON UserBehavior(behavior_type);这能让频繁的用户行为查询速度快上3倍不止。特别是当用户量破万后索引的效果立竿见影。后台管理直接用Django自带的admin做了扩展加了个行为分析面板# admin.py class BehaviorAdmin(admin.ModelAdmin): list_display (user, product, behavior_type, timestamp) list_filter (behavior_type, timestamp) def changelist_view(self, request, extra_contextNone): # 实时显示用户行为统计 stats UserBehavior.objects.values(behavior_type).annotate(totalCount(id)) extra_context {stats: stats} return super().changelist_view(request, extra_contextextra_context)项目部署时踩过个坑MySQL的默认配置处理不了高并发下的推荐计算。后来在my.cnf里加了这几句才解决[mysqld] innodb_buffer_pool_size 1G thread_cache_size 16 table_open_cache 2000这个系统现在跑在2核4G的云服务器上能扛住日均5万次左右的访问。未来打算把推荐算法升级成混合模型加入实时点击流分析不过那是后话了。目前版本对于中小型电商来说完全够用特别是冷启动阶段效果比随机推荐好上不少。