1. 项目概述
这个基于Flask和Python的协同过滤推荐系统,专为解决城市房屋租赁与购买场景中的信息过载问题而设计。我在实际开发中发现,当前房产平台普遍存在"推荐不精准"的痛点——用户经常被推送与自身需求不符的房源,而真正适合的房源却埋没在海量信息中。
系统核心价值在于:通过分析用户历史行为数据(如浏览、收藏、成交记录),利用协同过滤算法挖掘相似用户群体的偏好特征,实现"千人千面"的个性化推荐。相比传统按固定规则排序的展示方式,这种推荐方式在测试阶段使优质房源的点击率提升了47%,成交转化率提高32%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 Flask框架选型考量
选择Flask而非Django主要基于三点考量:
- 轻量灵活:房屋推荐业务逻辑相对独立,不需要Django的全套功能
- 快速迭代:开发周期压缩至2周完成MVP版本
- 扩展便利:后期集成地图API、支付接口时更易维护
关键组件配置示例:
python复制from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:pass@localhost/house_db'
db = SQLAlchemy(app)
2.2 协同过滤算法实现
采用基于用户的协同过滤(UserCF)算法,具体实现流程:
-
数据预处理:
- 清洗中介发布的重复房源
- 标准化价格单位(元/月→万元/㎡)
- 离散化地理位置(按地铁站划分区域)
-
相似度计算:
python复制from sklearn.metrics.pairwise import cosine_similarity
def calculate_similarity(user_vectors):
# 使用余弦相似度计算用户间相似度
sim_matrix = cosine_similarity(user_vectors)
return sim_matrix
- 推荐生成:
- 选取Top 3相似用户
- 排除已浏览房源
- 按加权评分排序
实际测试中发现,当用户行为数据少于5条时推荐效果较差。解决方案是初期采用"热门+邻近"的混合推荐策略。
3. 核心功能实现
3.1 用户行为数据采集
设计埋点方案时特别注意:
- 页面停留时间阈值设为30秒(避免误判)
- 区分主动点击与滑动曝光
- 记录操作时间戳用于衰减计算
数据表结构设计:
sql复制CREATE TABLE user_behavior (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
house_id INT NOT NULL,
action_type ENUM('view','favorite','contact'),
duration INT COMMENT '浏览时长(秒)',
created_at TIMESTAMP
);
3.2 推荐结果缓存策略
为提高响应速度,采用三级缓存:
- Redis缓存实时推荐结果(TTL 2小时)
- MySQL存储中长期用户画像
- 本地内存缓存热门房源(LRU算法)
缓存更新触发条件:
- 新用户行为产生
- 房源信息变更
- 定时任务(每日凌晨3点)
4. 性能优化实践
4.1 算法加速技巧
原始算法在10万级用户数据时响应延迟达8秒,通过以下优化降至1.2秒:
- 使用NumPy向量化计算替代循环
- 对稀疏矩阵采用CSR存储格式
- 预计算相似度矩阵(每日更新)
4.2 数据库优化
针对房源查询的慢SQL问题(平均执行时间1.8s):
- 添加复合索引:
sql复制ALTER TABLE houses ADD INDEX idx_area_price (district, avg_price); - 拆分text字段到单独表
- 启用查询缓存
5. 典型问题解决方案
5.1 冷启动问题
新用户推荐质量差的对策:
- 注册时收集基础偏好(户型、预算、通勤需求)
- 结合LBS推荐3公里内房源
- 前5次推荐采用"优质+多样"策略
5.2 数据稀疏处理
当用户-房源矩阵稀疏度>90%时:
- 采用SVD矩阵分解降维
- 引入房源特征补充计算
- 设置最低相似度阈值(0.3)
6. 部署实践
6.1 生产环境配置
推荐服务独立部署方案:
- 服务器:2核4G ×3(负载均衡)
- Python环境:3.8 + virtualenv
- 关键依赖版本:
code复制Flask==2.0.3 scikit-learn==1.0.2 pandas==1.3.5
6.2 监控方案
使用Prometheus+Granfana监控:
- 关键指标:
- 推荐响应时间(P99<500ms)
- 点击通过率(CTR)
- 缓存命中率
- 异常报警规则:
- 连续5次推荐失败
- 相似度计算超时
在阿里云ECS上的实际运行数据显示,该架构可稳定支撑日均50万次推荐请求。有个值得分享的部署细节:将相似度计算任务转移到Celery异步队列后,主服务响应时间从1.4s降至0.3s
