基于协同过滤算法的理财产品推荐系统
技术栈与架构
本项目采用 Python 3.8 作为核心开发语言,后端基于 Flask 轻量级 Web 框架构建。数据存储选用 MySQL 5.7,配合 Navicat 12 进行数据库管理,开发环境为 PyCharm。整体架构遵循 B/S(浏览器/服务器)模式,前端界面交互流畅,后端逻辑清晰,便于维护与扩展。
系统功能概览
系统主要划分为用户端与管理端两大模块,涵盖了从产品浏览、个性化推荐到后台审核的全流程。
用户端体验
首页集成了智能推荐引擎,用户登录后即可看到基于其历史行为生成的理财列表。支持按产品名称、类型等条件搜索,并提供购买、收藏及评论功能。

在个人中心,用户可以查看订单状态、管理收藏信息以及提交反馈。

管理端功能
管理员拥有最高权限,可管理系统首页内容、用户账户、产品类型定义、理财产品上下架、理财订单处理及反馈信息审核。

产品经理端则专注于产品的展示与操作,顶部显示系统名称与菜单,中部表格列明产品名称、期限、金额范围及发行状态,底部提供搜索、添加和删除按钮,布局清晰高效。

核心算法:协同过滤
传统的人工推荐方式效率低且难以规模化。本系统引入用户协同过滤算法(User-Based Collaborative Filtering),通过分析用户的历史行为和偏好,识别用户之间的相似性,从而预测用户对未接触产品的兴趣。
具体而言,系统会计算目标用户与其他用户的相似度(采用余弦相似度),找到最相似的用户群体,提取他们购买或收藏过但目标用户尚未接触的产品,按评分降序排列后返回给前端。
代码实现细节
在 Flask 路由中,我们实现了自动排序接口。核心逻辑分为两步:首先构建用户 - 商品矩阵,然后计算相似度并筛选推荐项。
# 计算余弦相似度
def cosine_similarity(a, b):
numerator = sum([a[key] * b[key] for key in a if key b])
denominator = math.sqrt(([a[key]** key a])) * math.sqrt(([b[key]** key b]))
numerator / denominator
():
request.method == :
user_ratings = {}
req_dict = session.get()
userinfo = session.get()
sql =
data = db.session.execute(sql)
data_dict = [((result.keys(), result)) result data.fetchall()]
item data_dict:
user_ratings.__contains__(item[]):
ratings_dict = user_ratings[item[]]
ratings_dict.__contains__(item[]):
ratings_dict[(item[])] +=
:
ratings_dict[(item[])] =
:
user_ratings[item[]] = { (item[]): }
sorted_recommended_goods = []
:
similarities = {
other_user: cosine_similarity(user_ratings[userinfo.get()], user_ratings[other_user])
other_user user_ratings other_user != userinfo.get()
}
most_similar_user = (similarities, key=similarities.get, reverse=)[]
recommended_goods = {
goods: rating
goods, rating user_ratings[most_similar_user].items()
goods user_ratings[userinfo.get()]
}
sorted_recommended_goods = (recommended_goods, key=recommended_goods.get, reverse=)
:
L = []
where = .join([
key, value req_dict.items()
key [, , , ]
])
where:
sql =
:
sql = ) union select * licaichanpin where (%().join(sorted_recommended_goods)+
data = db.session.execute(sql)
data_dict = [((result.keys(), result)) result data.fetchall()]
online_dict data_dict:
key online_dict:
((online_dict[key])) ((online_dict[key])):
online_dict[key] = online_dict[key].strftime()
L.append(online_dict)
jsonify({: , : , :{
: , : , : , : , : L[:(req_dict[])]
}})


