基于K-means聚类如何根据选定电影实现同簇电影推荐?
KMeans聚类电影动态推荐实现方案
核心逻辑拆为两步:首先获取输入对象(已有电影/自定义虚拟电影)对应的聚类簇编号,再从对应簇内筛选排序得到目标长度的推荐列表,不需要修改原有聚类结果。
场景1:选定数据集内已有电影做推荐
所有电影已经完成聚类打标,不需要重新调用模型预测,直接查询目标电影的簇号即可,可直接复用如下函数:
import pandas as pd def get_recommend_by_exist_movie(movie_primary_key: str, top_n: int = 20): """ 针对数据集内已有的电影生成同簇推荐 :param movie_primary_key: 目标电影在prediction_result表中的唯一标识,比如IMDB的tconst字段 :param top_n: 返回推荐结果数量 """ # 定位目标电影所属簇 target_row = prediction_result[prediction_result['tconst'] == movie_primary_key].iloc[0] target_cluster_id = target_row['cluster'] # 筛选同簇内容、排除目标电影本身,按评分、投票数倒序 recommend_list = prediction_result[ (prediction_result['cluster'] == target_cluster_id) & (prediction_result['tconst'] != movie_primary_key) ].sort_values(by=['averageRating', 'numVotes'], ascending=False) return recommend_list.head(top_n)
调用示例:要获取电影tt0111161(肖申克的救赎)的同簇20部推荐,直接执行get_recommend_by_exist_movie('tt0111161')即可。
场景2:输入自定义构造的虚拟电影特征做推荐
之前虚拟特征输入模型得到错误结果,基本都是特征预处理流程和训练阶段不一致导致的,只要严格复用训练阶段的预处理逻辑、保证特征维度/顺序完全对齐即可正常预测。
注意:训练阶段用到的特征编码器、标准化/归一化器必须是训练时fit完成的持久化对象,不能针对虚拟输入重新fit,否则特征分布会完全错位。
示例代码如下,假设你训练时已经保存了:
- 训练好的KMeans模型对象
kmeans_model - 数值特征标准化用的scaler对象
feature_scaler - 训练集特征的列顺序列表
train_feature_order(保证输入特征和训练时顺序完全一致,避免列错位)
def get_recommend_by_custom_movie(custom_feature: dict, top_n: int =20): """ 针对自定义构造的虚拟电影特征生成同簇推荐 :param custom_feature: 构造的电影特征字典,key要和训练时的特征名完全一致 :param top_n: 返回推荐结果数量 """ # 构造输入特征,对齐训练集列顺序 input_df = pd.DataFrame([custom_feature])[train_feature_order] # 复用训练时的预处理逻辑做特征转换 input_scaled = feature_scaler.transform(input_df) # 预测所属簇 target_cluster_id = kmeans_model.predict(input_scaled)[0] # 筛选同簇内容排序返回 recommend_list = prediction_result[ prediction_result['cluster'] == target_cluster_id ].sort_values(by=['averageRating', 'numVotes'], ascending=False) return recommend_list.head(top_n)
优化提示
如果需要更高的推荐匹配度,不要仅按平均评分、投票数做热度排序,可以在同簇内计算输入电影和簇内所有电影的特征余弦相似度,按「相似度0.7 + 归一化后评分0.3」的加权分排序,结果会比纯热度排序更贴合输入电影的特征。
内容的提问来源于stack exchange,提问作者Mettepen
相关产品推荐
相关产品推荐

