基于协同过滤的农作物推荐系统
创建于 2026 年 2 月 26 日
项目介绍
这是一个面向农户的智能农作物推荐平台,核心目标是回答一个实际的种植决策问题:“我这块地,下一茬种什么最合适?“系统不再只依赖通用的种植经验,而是把用户的地块条件、历史种植记录以及其他相似用户的种植经验放进同一个推荐模型里,输出个性化的作物候选列表。
项目采用前后端分离架构,后端使用 Python + Django REST Framework,前端使用 Vue 3,覆盖智能推荐、地块管理、作物库、种植记录、推荐分析、农业资讯和社区交流等完整业务模块,是一个从算法到业务闭环都可运行的完整系统。
推荐算法是项目的核心,集中实现在 backend/recommendations/services/ 目录下,分为三个相互配合的服务:协同过滤(Collaborative Filtering)、特征工程(Feature Engineering)和匹配度计算(Match Calculator),并针对冷启动、数据稀疏等真实场景设计了降级策略。
项目架构
后端基于 Django 5.1.9 与 Django REST Framework 3.16 构建,划分为 7 个业务 App:users(用户与 JWT 认证)、plots(地块)、crops(作物库)、records(种植记录与评分)、recommendations(推荐系统)、news(农业资讯)、community(社区交流)。API 统一挂载在 /api/v1/ 前缀下,认证采用自定义的 JWT 实现(users/authentication.py,禁用 CSRF),数据库为 MySQL(utf8mb4)。
前端使用 Vue 3 + Vite + Element Plus + Pinia + Vue Router,并通过 ECharts 实现推荐分析图表。路由包含首页、登录/注册、智能推荐、作物库、地块管理、种植记录、推荐分析、资讯中心、社区交流和个人中心等页面,路由守卫根据 token 控制登录态访问。
数据模型围绕推荐目标设计:Plot 记录地块的面积、省市县与经纬度、土壤类型、土壤 N/P/K 含量、pH 值、有机质、气候带、年均温度、降雨量、无霜期;Crop 记录作物的生长周期、适宜温度/降雨量/pH 范围、氮磷钾需求量、市场均价、亩产量、种植难度和抗病虫害能力(1-5);PlantRecord 记录每次种植的产量、收益、成本与状态;UserCropRating 保存用户对作物的 1-5 分显式评分。
核心功能
- 混合协同过滤推荐:
CollaborativeFiltering类用 NumPy 构建用户-作物评分矩阵,基于 scikit-learn 的cosine_similarity计算相似度。基于用户的推荐(User-CF)先找到与当前用户最相似的 K 个用户,再按相似度加权汇总他们对候选作物的评分,排除用户已种作物后取 Top-N;基于物品的推荐(Item-CF)则从用户已种作物出发,按作物相似度矩阵扩展。接口支持hybrid、user_based、item_based三种算法实时切换,混合模式下 User-CF 优先、Item-CF 补足名额。 - 隐式评分与特征工程:评分数据优先读取
UserCropRating显式评分;当数据不足时,从状态为已收获的种植记录自动生成隐式评分——按实际收益除以 2000 归一化到 1-5 分,默认 4.0。FeatureEngineer用MinMaxScaler归一化地块的土壤养分、pH、有机质、温度、降雨、无霜期、面积等数值特征,用LabelEncoder编码区域;作物特征归一化后拼接种植难度编码(easy/medium/hard 映射为 0/0.5/1),多地块用户取特征均值。 - 三维匹配度与推荐理由:
MatchCalculator独立计算土壤匹配度(pH 范围与氮养分配比)、气候匹配度(温度与降雨量适宜区间)和经济匹配度(亩产 × 市场价按 10000 元/亩归一化),三者平均得到综合匹配分,并自动生成”您所在地区气候条件非常适合种植""土壤养分匹配度高""经济效益良好""抗病虫害能力强""种植难度低,适合新手”等可读性推荐理由。 - 冷启动降级:当系统没有评分数据或找不到相似用户时,协同过滤结果为空,自动回退到基于内容的匹配度推荐;连地块信息也没有时,则返回作物库中的热门作物兜底,保证任何状态下页面都有推荐结果可展示。
- 推荐分析可视化:
Analysis.vue页面用 ECharts 呈现推荐得分 Top 6 柱状图、土壤/气候/经济匹配维度对比图、候选作物类别分布环形图,并汇总地块画像、历史记录、评分反馈、当前候选四类概览卡片,帮助用户理解推荐依据,评分反馈会回流到后续推荐逻辑。 - 完整业务支撑:作物库提供 12 种常见作物的基础数据(水稻、小麦、玉米、大豆、红薯、番茄、黄瓜、白菜、苹果、柑橘、油菜、棉花),配合地块管理、种植记录、农业资讯和社区交流模块,为推荐系统持续积累行为数据。
功能截图
暂无运行截图。
快速上手
项目需要 Python 3.12+、Node.js 16+ 与 MySQL 5.7+ 环境,前端与后端需分别启动(两个终端窗口)。
后端启动步骤:创建并激活 conda 环境后,进入 backend/ 目录执行 pip install -r requirements.txt(依赖包含 Django、DRF、PyJWT、pymysql、pandas、numpy、scikit-learn、scipy);在 config/settings.py 中修改 DATABASES 为自己的 MySQL 连接信息;依次执行 python manage.py migrate、python manage.py createsuperuser 创建管理员,再执行 python init_data.py 初始化 12 种作物数据;最后 python manage.py runserver 启动后端,默认监听 127.0.0.1:8000。
前端启动:进入 frontend/ 目录执行 npm install 与 npm run dev,浏览器访问 http://localhost:5173 即可。日常开发常用账号 admin / admin123;如需清空数据重建,可使用 python reset_migrations.py 一键删除迁移文件、清理缓存并重新生成迁移。
访问地址汇总:前端页面 http://localhost:5173、后端接口 http://127.0.0.1:8000、Django 管理后台 http://127.0.0.1:8000/admin。
总结
这个项目最大的价值在于把协同过滤从”算法课上的矩阵公式”落成了”可运行、可解释、可迭代的产品功能”:评分矩阵、余弦相似度、Top-N 推荐是标准做法,但隐式评分生成、特征工程降级、冷启动兜底、匹配度拆解与推荐理由生成,都是工程化落地时才会遇到的问题,项目给出了完整而务实的答案。
从产品角度看,系统围绕”推荐”构建了地块、作物、记录、评分、资讯、社区的业务闭环,推荐分析页让用户和开发者都能看到推荐依据,形成了”数据输入 → 算法计算 → 结果解释 → 反馈回流”的完整链路。未来若数据规模增长,可进一步引入矩阵分解(SVD)、基于内容与协同过滤的加权融合调参,以及在特征中加入播种季节、轮作约束等上下文信息来提升推荐精度。